rksoftware

Visual Studio とか C# とかが好きです

C# 2.0 以降の新機能の確認 - C# 2.0 - デリゲートの分散 (共変性と反変性)

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

デリゲートの分散 (共変性と反変性)

 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/covariance-contravariance/using-variance-in-delegates
 共変性により、メソッドの戻り値の型をデリゲートに定義されている型のサブクラスにできる。 反変性によりメソッドのパラメーター型をデリゲートのパラメーターの型のスーパークラスにできる。

class Program
{
    class A { }
    class A2 : A { }
    class A22 : A2 { }
    class A3 : A { }

    delegate A2 MyDelegate(A2 a2);

    static void Main(string[] args)
    {
        // これはできる。
        // A 型の引数に A2 型を渡しても OK。
        // A2 型の戻り値の実体が A22 型でも OK。
        MyDelegate deleg1 = Method1;    
        A a = deleg1(new A2());

        //MyDelegate deleg2 = Method2;    <- これはできない。A3 型の引数に A2 型は渡せない。
        //MyDelegate deleg3 = Method3;    < -これはできない。A2 型の戻り値の実体は A 型にできない。
    }

    static A22 Method1(A a) { return null; }

    static A2 Method2(A3 a) { return null; }

    static A Method3(A2 a) { return null; }
}