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# 語法和用法的決定性來源。

請參閱

參考

in (泛型修飾詞) (C# 參考)

修飾詞 (C# 參考)

概念

泛型介面中的變異數 (C# 和 Visual Basic)