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

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

共変性は、ジェネリック パラメーターによって指定された型よりも強い派生型を使用できるようにする機能です。Covariance enables you to use a more 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 are supported for reference types, but they are not supported for value types.

共変の型パラメーターを持つインターフェイスを使用すると、そのインターフェイスのメソッドは、型パラメーターによって指定された型よりも強い派生型を返すことができます。An interface that has a covariant type parameter enables its methods to return more derived types than those specified by the type parameter. たとえば、.NET Framework 4 の IEnumerable<T> では T 型が共変なので、特別な変換メソッドを使用しなくても IEnumerable(Of String) 型のオブジェクトを IEnumerable(Of Object) 型のオブジェクトに割り当てることができます。For example, because in .NET Framework 4, in IEnumerable<T>, type T is covariant, you can assign an object of the IEnumerable(Of String) type to an object of the IEnumerable(Of Object) type without using any special conversion methods.

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

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

Example

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

// Covariant interface.
interface ICovariant<out R> { }

// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }

// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }

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

        // You can assign istr to iobj because
        // the ICovariant interface is covariant.
        iobj = istr;
    }
}

ジェネリック インターフェイスでは、次の条件を満たす場合に型パラメーターを共変として宣言できます。In a generic interface, a type parameter can be declared covariant if it satisfies the following conditions:

  • 型パラメーターがインターフェイス メソッドの戻り値の型としてのみ使用され、メソッド引数の型として使用されない。The type parameter is used only as a return type of interface methods and not used as a type of method arguments.

    注意

    この規則には例外が 1 つあります。There is one exception to this rule. 共変のインターフェイスで反変の汎用デリゲートをメソッド パラメーターとして使用する場合は、共変の型をこのデリゲートのジェネリック型パラメーターとして使用できます。If in a covariant interface you have a contravariant generic delegate as a method parameter, you can use the covariant type as a generic type parameter for this delegate. 共変および反変の汎用デリゲートの詳細については、「デリゲートの分散」および「Func および Action 汎用デリゲートでの分散の使用」を参照してください。For more information about covariant and contravariant generic delegates, see Variance in Delegates and Using Variance for Func and Action Generic Delegates.

  • 型パラメーターがインターフェイス メソッドのジェネリック制約として使用されない。The type parameter is not used as a generic constraint for the interface methods.

Example

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

// Covariant delegate.
public delegate R DCovariant<out R>();

// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }

public static Button SampleButton()
{ return new Button(); }

public void Test()
{            
    // Instantiate the delegates with the methods.
    DCovariant<Control> dControl = SampleControl;
    DCovariant<Button> dButton = SampleButton;

    // You can assign dButton to dControl
    // because the DCovariant delegate is covariant.
    dControl = dButton;

    // Invoke the delegate.
    dControl(); 
}

汎用デリゲートでは、メソッドの戻り値の型としてのみ使用され、メソッド引数には使用されない型を共変として宣言できます。In a generic delegate, a type can be declared covariant if it is used only as a method return type and not used for method arguments.

C# 言語仕様C# Language Specification

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

関連項目See Also

ジェネリック インターフェイスの分散Variance in Generic Interfaces
inin
修飾子Modifiers