out (泛型修飾詞) (C# 參考)
就泛型型別參數而言,out 關鍵字會指定型別參數為 Covariant。您可以在泛型介面及委派中使用 out 關鍵字。
共變數允許您使用與泛型參數指定的型別相比,其衍生程度較大的型別。這樣可以允許實作 Variant 介面的類別進行隱含轉換,以及委派型別的隱含轉換。參考型別會支援共變數和 Contravariance,但是實值型別則不支援。
具有 Covariant 型別參數的介面允許其方法傳回與介面型別參數指定的型別相比,其衍生程度較大的型別。例如,在 .NET Framework 4 的 IEnumerable<T> 中,由於型別 T 為 Covariant,因此可以將型別為 IEnumerabe(Of String) 的物件指派給型別為 IEnumerable(Of Object) 的物件,而不需使用任何特別的轉換方法。
您可以將其他相同型別的委派指派給 Covariant 委派,但是前者要有衍生程度較大的泛型型別參數。
如需詳細資訊,請參閱 共變數和反變數 (C# 和 Visual Basic)。
範例
下列範例示範如何宣告、擴充和實作 Covariant 泛型介面,同時也示範如何對實作 Covariant 介面的類別使用隱含轉換。
// 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;
}
}
在泛型介面中,如果型別參數滿足下列條件,您就可以將它宣告為 Covariant:
型別參數只當做介面方法的傳回型別,而不能當做方法引數的型別使用。
注意事項 這個規則只有一個例外。如果 Covariant 介面中有當做方法參數的 Contravariant 泛型委派,則可以使用 Covariant 型別做為這個委派的泛型型別參數。如需 Covariant 及 Contravariant 泛型委派的詳細資訊,請參閱委派中的變異數 (C# 和 Visual Basic)和針對 Func 與 Action 委派使用變異數 (C# 和 Visual Basic)。
型別參數不能當做介面方法的泛型條件約束使用。
下列範例示範如何宣告、執行個體化和叫用 Covariant 泛型委派,同時也示範如何隱含轉換委派型別。
// 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();
}
在泛型委派中,如果型別只當做方法傳回型別,而不當做方法引數使用,就可以將它宣告為 Covariant。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格。語言規格是 C# 語法和用法的限定來源。