カテゴリ: C# 更新日: 2026/01/11

C#のジェネリックメソッドの定義と使い方を解説!初心者でもわかる基本講座

C#のジェネリックメソッドの定義と使い方を解説
C#のジェネリックメソッドの定義と使い方を解説

先生と生徒の会話形式で理解しよう

生徒

「C#のメソッドで、いろんなデータ型に使える方法ってありますか?」

先生

「ありますよ。それが“ジェネリックメソッド”という仕組みです。」

生徒

「ジェネリックメソッドって何か特別な方法なんですか?」

先生

「はい、例えば“int”にも“string”にも使える共通のメソッドを作れるんです。さっそく基本から見ていきましょう!」

1. ジェネリックメソッドとは?

1. ジェネリックメソッドとは?
1. ジェネリックメソッドとは?

ジェネリックメソッドとは、C#で定義するメソッドの中で、使うデータの型(intやstringなど)を決めずに、柔軟に対応できるようにしたメソッドのことです。

通常のメソッドでは、引数や戻り値の型をあらかじめ指定する必要がありますが、ジェネリックメソッドでは、「このメソッドはどんな型でも使えますよ」と設定できます。

たとえば、「整数」や「文字列」どちらでも使えるような処理を、一つの共通メソッドで書けるのが特徴です。

2. なぜジェネリックメソッドが便利なの?

2. なぜジェネリックメソッドが便利なの?
2. なぜジェネリックメソッドが便利なの?

たとえば、次のような状況を考えてみましょう。

  • リストの中身を表示するメソッドを作りたい
  • 整数のリスト、文字列のリスト、日付のリスト…と複数の型がある

このようなとき、普通のメソッドでは型ごとに別々に作る必要があります。でもジェネリックメソッドなら、たった1つのメソッドで全部対応できるのです。

3. ジェネリックメソッドの基本の書き方

3. ジェネリックメソッドの基本の書き方
3. ジェネリックメソッドの基本の書き方

ジェネリックメソッドの書き方には、ちょっと特徴があります。型を指定するために、メソッド名の前に<T>という形で記述します。

<T>は、「Tは何かの型ですよ」と示す記号のようなものです。


public void ShowItem<T>(T item)
{
    Console.WriteLine(item);
}

この例では、itemという引数の型はTになっていて、Tの中身は呼び出すときに決まります。

4. ジェネリックメソッドの使い方(呼び出し)

4. ジェネリックメソッドの使い方(呼び出し)
4. ジェネリックメソッドの使い方(呼び出し)

ジェネリックメソッドを呼び出すときは、型を指定するか、C#が自動的に判断してくれます。


ShowItem<int>(100);         // int型として呼び出し
ShowItem<string>("こんにちは"); // string型として呼び出し

また、C#の型推論(自動で型を判断する機能)を使えば、次のように型を省略して書くこともできます。


ShowItem(200);              // C#がintだと判断
ShowItem("おはよう");       // C#がstringだと判断

5. 型パラメータとは?

5. 型パラメータ<T>とは?
5. 型パラメータとは?

<T>は「型パラメータ」と呼ばれ、どんな型にも置き換えることができる記号です。

慣例的にTという1文字が使われますが、複数ある場合は<T, U>のように複数の型を指定できます。

例えば、2つの異なる型を受け取るメソッドも作れます。


public void ShowTwoItems<T, U>(T item1, U item2)
{
    Console.WriteLine(item1);
    Console.WriteLine(item2);
}

// 呼び出し例
ShowTwoItems<int, string>(1, "テスト");

6. よくある間違いと注意点

6. よくある間違いと注意点
6. よくある間違いと注意点

ジェネリックメソッドを使うときに初心者がやりがちなミスをいくつか紹介します。

  • 型を明示する必要があると勘違いする → 型推論が効く場合は省略可能
  • 型パラメータと普通の引数を混同する<T>はあくまで「型そのもの」です
  • 制約(せいやく)を知らずに使う → ジェネリックには「この型はこういう条件を満たす必要がある」と制約をつけることもできます(※本記事では割愛)

7. 実行結果の例

7. 実行結果の例
7. 実行結果の例

以下は、ジェネリックメソッドを使ったときの出力結果の例です。


100
こんにちは
200
おはよう
1
テスト

8. ジェネリックメソッドと通常のメソッドの違い

8. ジェネリックメソッドと通常のメソッドの違い
8. ジェネリックメソッドと通常のメソッドの違い

最後に、ジェネリックメソッドと普通のメソッドの違いを簡単にまとめます。

  • 通常のメソッド:特定の型(intやstringなど)で決まっている
  • ジェネリックメソッド:使うときに型を決められるため、汎用的(はんようてき)で使いやすい

プログラムが大きくなるほど、共通の処理をジェネリックで書けると、再利用性が高まり、メンテナンスが楽になります。

まとめ

まとめ
まとめ

C#におけるジェネリックメソッドは、プログラムの汎用性を高める非常に強力な仕組みです。型に依存しない共通処理を記述できるため、メンテナンス性や再利用性が大幅に向上します。この記事では、ジェネリックメソッドの定義方法や使い方、基本的な書き方から複数型パラメータの使い分け、型推論の利点まで丁寧に学びました。

特に重要なのは、<T>のような型パラメータの使い方です。この記法を使えば、例えばint型でもstring型でも同じように動作する柔軟なメソッドが作れます。以下はその典型的な例です。


public void ShowData<T>(T data)
{
    Console.WriteLine("受け取ったデータ: " + data);
}

ShowData(123);           // int
ShowData("こんにちは");   // string
ShowData(3.14);          // double

また、複数の型パラメータを使うことで、より複雑なデータの扱いも可能になります。


public void DisplayKeyValue<TKey, TValue>(TKey key, TValue value)
{
    Console.WriteLine($"キー: {key}, 値: {value}");
}

DisplayKeyValue(1, "リンゴ");
DisplayKeyValue("ID", 100);

このように、C#のジェネリックメソッドはシンプルな構文ながら、さまざまな型に対応できる便利な仕組みです。

今後の開発では、「同じような処理が複数の型で必要になったとき」にはまずジェネリックメソッドを検討することが重要です。また、制約(where句など)を使えば、より高度な設計も可能になります。

プログラムを柔軟に拡張し、再利用しやすく保つためにも、ジェネリックの基本概念をしっかり理解しておくことがC#の習得において非常に役立つでしょう。

先生と生徒の振り返り会話

生徒

「先生、ジェネリックメソッドって最初は記号が難しそうだなって思ってたけど、思ったよりわかりやすかったです!」

先生

「そうですね。Tという記号に慣れれば、あとは普通のメソッドと同じように使えますからね。」

生徒

「intもstringも同じメソッドで処理できるのってすごく便利ですね!リストの中身を全部表示したり、複数の型を受け取るときに使ってみたいです。」

先生

「はい、その使い方はとてもよい応用例ですね。型推論を使えば記述もスッキリするし、コードの見通しも良くなります。」

生徒

「型を指定するのが必須じゃないっていうのも知れて安心しました!」

先生

「それがC#のいいところですね。無理なく汎用的な設計ができるように工夫されていますよ。」

生徒

「これからは、似たような処理が複数の型で必要なときは、まずジェネリックで書けないか考えてみます!」

先生

「素晴らしい心がけですね。ジェネリックはC#の開発力を大きく広げてくれる武器になりますよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

C#のジェネリックメソッドとは何ですか?初心者向けにやさしく教えてください。

C#のジェネリックメソッドとは、int型やstring型など特定のデータ型に依存せず、さまざまな型に対して使える柔軟なメソッドのことです。汎用的なコードが書ける便利な仕組みです。
カテゴリの一覧へ
新着記事
New1
C#
C#のメモリ管理とガーベジコレクションの基礎を理解しよう
New2
C#
C#の参照型と値型の違いを初心者向けにやさしく解説!
New3
C#
C#のクエリ式とメソッド式の書き換え方を完全ガイド!LINQの2つの書き方をマスター
New4
C#
C#の戻り値にタプルを使う方法!複数の値を返すテクニック
人気記事
No.1
Java&Spring記事人気No1
C#
C#で文字列が数値か判定する方法を解説!char.IsDigitやTryParseの基本
No.2
Java&Spring記事人気No2
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.3
Java&Spring記事人気No3
C#
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
No.4
Java&Spring記事人気No4
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.7
Java&Spring記事人気No7
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.8
Java&Spring記事人気No8
C#
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方