ジェネリクスの反変性は、しっくり来てるような来てないような感じがあるが、
ジェネリックの共変性と反変性 | Microsoft Docs
ジェネリクスの共変性・反変性 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
コード的には、
// 名前空間の登録 using System; // 共通データ型と基本クラス(System名前空間) // メインクラス class MainClass // MainClassクラスの定義 { // デリゲートの定義 delegate void DelegateTestFunc<T>(T t); // 引数がT型のtで戻り値のないDelegateTestFunc. // メインメソッド static void Main() // Mainメソッドの定義 { // デリゲートの生成. DelegateTestFunc<object> odtf = new DelegateTestFunc<object>(TestFunc); // DelegateTestFunc<object>のodtfを生成. // odtfを実行. odtf("ABCDE"); // odtfに文字列"ABCDE"を渡して実行. } // デリゲートの渡すメソッドTestFunc(object). static void TestFunc(object obj) { // objを出力. Console.WriteLine(obj); // Console.WriteLineでobjを出力. } }
として、
ABCDE 続行するには何かキーを押してください . . .
こうなる。
次に、
// 名前空間の登録 using System; // 共通データ型と基本クラス(System名前空間) // メインクラス class MainClass // MainClassクラスの定義 { // デリゲートの定義 delegate void DelegateTestFunc<T>(T t); // 引数がT型のtで戻り値のないDelegateTestFunc. // メインメソッド static void Main() // Mainメソッドの定義 { // デリゲートの生成. DelegateTestFunc<object> odtf = new DelegateTestFunc<object>(TestFunc); // DelegateTestFunc<object>のodtfを生成. // odtfを実行. odtf("ABCDE"); // odtfに文字列"ABCDE"を渡して実行. // objectからstringへ. DelegateTestFunc<string> sdtf = odtf; // sdtfにodtfを代入. // sdtfを実行. sdtf("VWXYZ"); // sdtfに"VWXYZ"を渡す. } // デリゲートの渡すメソッドTestFunc(object). static void TestFunc(object obj) { // objを出力. Console.WriteLine(obj); // Console.WriteLineでobjを出力. } }
こういうことがしたいんだけれども、
こうなってしまう。
無理矢理こういうことをしてもダメなので、
Tの前にinを付けると、
これだと通る。
ABCDE VWXYZ 続行するには何かキーを押してください . . .
こうできる。