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

ジェネリック型パラメーターの in キーワードは、型パラメーターが反変であることを指定します。For generic type parameters, the in keyword specifies that the type parameter is contravariant. in キーワードは、ジェネリック インターフェイスとデリゲートで使用できます。You can use the in keyword in generic interfaces and delegates.

反変性は、ジェネリック パラメーターによって指定された型よりも弱い派生型を使用できるようにする機能です。Contravariance enables you to use a less derived type than that specified by the generic parameter. これにより、バリアント インターフェイスを実装するクラスの暗黙の型変換とデリゲート型の暗黙の型変換が可能となります。This allows for implicit conversion of classes that implement variant interfaces and implicit conversion of delegate types. ジェネリック型パラメーターの共変性および反変性は参照型ではサポートされますが、値型ではサポートされません。Covariance and contravariance in generic type parameters are supported for reference types, but they are not supported for value types.

型をジェネリック インターフェイスまたはデリゲートで反変として宣言できるのは、メソッド引数の型としてのみ使用され、メソッドの戻り値の型としては使用されない場合です。A type can be declared contravariant in a generic interface or delegate if it is used only as a type of method arguments and not used as a method return type. Ref パラメーターと out パラメーターをバリアントにすることはできません。Ref and out parameters cannot be variant.

反変の型パラメーターを持つインターフェイスを使用すると、そのインターフェイスのメソッドは、インターフェイス型パラメーターによって指定された型よりも弱い派生型の引数を受け取ることができます。An interface that has a contravariant type parameter allows its methods to accept arguments of less derived types than those specified by the interface type parameter. たとえば、.NET Framework 4 の IComparer<T> インターフェイスでは T 型が反変なので、EmployeePerson を継承する場合、特別な変換メソッドを使用しなくても IComparer(Of Person) 型のオブジェクトを IComparer(Of Employee) 型のオブジェクトに割り当てることができます。For example, because in .NET Framework 4, in the IComparer<T> interface, type T is contravariant, you can assign an object of the IComparer(Of Person) type to an object of the IComparer(Of Employee) type without using any special conversion methods if Employee inherits Person.

反変のデリゲートには、型は同じでありながらより弱い派生ジェネリック型パラメーターを持つ別のデリゲートを割り当てることができます。A contravariant delegate can be assigned another delegate of the same type, but with a less derived generic type parameter.

詳細については、「共変性と反変性」を参照してください。For more information, see Covariance and Contravariance.


次の例では、反変のジェネリック インターフェイスを宣言、拡張、および実装する方法を示します。The following example shows how to declare, extend, and implement a contravariant generic interface. また、このインターフェイスを実装するクラスの暗黙的な変換を使用する方法も示します。It also shows how you can use implicit conversion for classes that implement this interface.

// 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;


次の例では、反変の汎用デリゲートを宣言、インスタンス化、および呼び出す方法を示します。The following example shows how to declare, instantiate, and invoke a contravariant generic delegate. また、デリゲート型を暗黙的に変換する方法も示します。It also shows how you can implicitly convert a delegate type.

// 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# Language Specification

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

関連項目See Also

共変性と反変性Covariance and Contravariance