ジェネリクスの反変性

ジェネリクスの反変性は、しっくり来てるような来てないような感じがあるが、

ジェネリックの共変性と反変性 | 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
続行するには何かキーを押してください . . .

こうできる。

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