ジェネリクスの共変性

C#4でジェネリクスにおいても共変性という性質を持てるようになった。

ジェネリックの共変性と反変性 | Microsoft Docs
ジェネリクスの共変性・反変性 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

ITest.csというのを追加し、

// テストインターフェース
interface ITest<T>  // ITest<T>インターフェース
{

    // メソッド
    void Set(T[] ary);  // Tの配列aryをセットするSet.
    T[] Get();  // Tの配列を返すGet.

}

こんなインターフェースで、

実装クラスTest.csはこんな感じ。
MainClass.csは、

ITest<string>がITest<object>に変換できるのかどうか。

ビルドは通るけど
ビルドは通るけど

ビルドは通るけど。

こうなってしまう
こうなってしまう

実行すると、こうなってしまう。

ここの時点でダメ
ここの時点でダメ

ここの時点でダメ。

// テストインターフェース
interface ITest<out T>  // ITest<T>インターフェース
{

    // メソッド
    void Set(T[] ary);  // Tの配列aryをセットするSet.
    T[] Get();  // Tの配列を返すGet.

}

ということでITest.csでTの前にoutを入れてみると、

今度はビルドエラー
今度はビルドエラー

今度はビルドエラー。
まあ、共変性は取得限定なので、

メッセージとは逆にSetをコメントアウトすると、

今度は通る
今度は通る

今度は通る。

AAA
BBB
CCC
AAA
BBB
CCC
続行するには何かキーを押してください . . .

意図通りにキャストできて動いた・・・。

Sample/cs/GenericsCovariance/GenericsCovariance/src/GenericsCovariance at master · bg1bgst333/Sample · GitHub