out (ジェネリック修飾子) (C# リファレンス)
ジェネリック型パラメーターの out キーワードは、型パラメーターが共変であることを指定します。out キーワードは、ジェネリック インターフェイスとデリゲートで使用できます。
共変性は、ジェネリック パラメーターによって指定された型よりも強い派生型を使用できるようにする機能です。これにより、バリアント インターフェイスを実装するクラスの暗黙の型変換とデリゲート型の暗黙の型変換が可能となります。共変性および反変性は参照型ではサポートされますが、値型ではサポートされません。
共変の型パラメーターを持つインターフェイスを使用すると、そのインターフェイスのメソッドは、型パラメーターによって指定された型よりも強い派生型を返すことができます。たとえば、.NET Framework 4 の IEnumerable<T> では T 型が共変なので、特別な変換メソッドを使用しなくても IEnumerabe(Of String) 型のオブジェクトを IEnumerable(Of Object) 型のオブジェクトに割り当てることができます。
共変のデリゲートには、型は同じだがより強い派生ジェネリック型パラメーターを持つ別のデリゲートを割り当てることができます。
詳細については、「共変性と反変性 (C# および Visual Basic)」を参照してください。
使用例
共変のジェネリック インターフェイスを宣言、拡張、および実装する方法を次の例に示します。また、共変のインターフェイスを実装するクラスの暗黙の型変換を使用する方法も示します。
// 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;
}
}
ジェネリック インターフェイスでは、次の条件を満たす場合に型パラメーターを共変と宣言できます。
型パラメーターがインターフェイス メソッドの戻り値の型としてのみ使用されてメソッド引数の型として使用されない。
[!メモ]
この規則には例外が 1 つあります。共変のインターフェイスで反変の汎用デリゲートをメソッド パラメーターとして使用する場合は、共変の型をこのデリゲートのジェネリック型パラメーターとして使用できます。共変および反変の汎用デリゲートの詳細については、「デリゲートの分散 (C# および Visual Basic)」および「Func および Action 汎用デリゲートでの分散の使用 (C# および Visual Basic)」を参照してください。
型パラメーターがインターフェイス メソッドのジェネリック制約として使用されない。
共変の汎用デリゲートを宣言、インスタンス化、および起動する方法を次の例に示します。また、デリゲート型を暗黙的に変換する方法も示します。
// 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();
}
汎用デリゲートでは、メソッドの戻り値の型としてのみ使用されてメソッド引数の型として使用されない型を共変と宣言できます。
C# 言語仕様
詳細については、「C# 言語仕様」を参照してください。言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。