in (ジェネリック修飾子) (C# リファレンス)

ジェネリック型パラメーターの in キーワードは、型パラメーターが反変であることを指定します。 in キーワードは、ジェネリック インターフェイスとデリゲートで使用できます。

反変性は、ジェネリック パラメーターによって指定された型よりも弱い派生型を使用できるようにする機能です。 これにより、バリアント インターフェイスを実装するクラスの暗黙の型変換とデリゲート型の暗黙の型変換が可能となります。 ジェネリック型パラメーターの共変性および反変性は参照型ではサポートされますが、値型ではサポートされません。

ジェネリック インターフェイスまたは汎用デリゲートでは、メソッド引数の型としてのみ使用され、メソッドの戻り値の型としては使用されない型を反変と宣言できます。 Ref パラメーターと out パラメーターにバリアントを指定することはできません。

反変の型パラメーターを持つインターフェイスを使用すると、そのインターフェイスのメソッドは、インターフェイスの型パラメーターによって指定された型よりも弱い派生型の引数を受け取ることができます。 たとえば、.NET Framework 4 の IComparer<T> インターフェイスでは T 型が反変なので、Employee が Person を継承する場合、特別な変換メソッドを使用しなくても IComparer(Of Person) 型のオブジェクトを IComparer(Of Employee) 型のオブジェクトに割り当てることができます。

反変のデリゲートには、型は同じだがより弱い派生ジェネリック型パラメーターを持つ別のデリゲートを割り当てることができます。

詳細については、「共変性と反変性 (C# および Visual Basic)」を参照してください。

使用例

反変のジェネリック インターフェイスを宣言、拡張、および実装する方法を次の例に示します。 また、このインターフェイスを実装するクラスの暗黙の型変換を使用する方法も示します。

// Contravariant interface.
interface IContravariant<in A> { }

// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }

// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }

class Program
{
    static void Test()
    {
        IContravariant<Object> iobj = new Sample<Object>();
        IContravariant<String> istr = new Sample<String>();

        // You can assign iobj to istr because
        // the IContravariant interface is contravariant.
        istr = iobj;
    }
}

反変の汎用デリゲートを宣言、インスタンス化、および起動する方法を次の例に示します。 また、デリゲート型を暗黙的に変換する方法も示します。

// Contravariant delegate.
public delegate void DContravariant<in A>(A argument);

// Methods that match the delegate signature.
public static void SampleControl(Control control)
{ }
public static void SampleButton(Button button)
{ }

public void Test()
{

    // Instantiating the delegates with the methods.
    DContravariant<Control> dControl = SampleControl;
    DContravariant<Button> dButton = SampleButton;

    // You can assign dControl to dButton
    // because the DContravariant delegate is contravariant.
    dButton = dControl;

    // Invoke the delegate.
    dButton(new Button()); 
}

C# 言語仕様

詳細については、「C# 言語仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

参照

参照

out (ジェネリック修飾子) (C# リファレンス)

修飾子 (C# リファレンス)

その他の技術情報

共変性と反変性 (C# および Visual Basic)