對於泛型型別參數, Out 關鍵詞會指定類型為 covariant。
備註
共變數可讓您使用比泛型參數所指定的衍生類型更衍生的類型。 這允許隱含轉換實作 Variant 介面的類別,以及委派類型的隱含轉換。
如需詳細資訊,請參閱 共變數和反變數。
規則
您可以在泛型介面和委派中使用 Out 關鍵詞。
在泛型介面中,如果類型參數符合下列條件,則可以宣告 covariant:
型別參數只能當做介面方法的傳回型別,而不是當做方法自變數的類型使用。
備註
此規則有一個例外狀況。 如果在 covariant 介面中,您有反變數泛型委派做為方法參數,您可以使用 covariant 類型做為此委派的泛型型別參數。 如需 covariant 和 contravariant 泛型委派的詳細資訊,請參閱 委派中的變異 數 和使用 Func 和 Action 泛型委派的變異數。
類型參數不會做為介面方法的泛型條件約束。
在泛型委派中,如果型別參數只當做方法傳回型別,而且不用於方法自變數,則可以宣告 covariant。
參考型別支援共變數和反變數,但實值型別不支援共變數和反變數。
在 Visual Basic 中,您無法在 covariant 介面中宣告事件,而不需要指定委派類型。 此外,covariant 介面不能有巢狀類別、列舉或結構,但它們可以有巢狀介面。
行為
具有 covariant 類型參數的介面可讓其方法傳回比類型參數指定的衍生類型更多。 例如,由於在 .NET Framework 4 中,在 中, IEnumerable<T>類型 T 是 covariant,因此您可以將類型的物件 IEnumerable(Of String) 指派給型別的物件 IEnumerable(Of Object) ,而不需使用任何特殊的轉換方法。
covariant 委派可以指派相同類型的另一個委派,但具有更衍生的泛型型別參數。
範例 1
下列範例示範如何宣告、擴充及實作 covariant 泛型介面。 它也會示範如何針對實作covariant介面的類別使用隱含轉換。
' Covariant interface.
Interface ICovariant(Of Out R)
End Interface
' Extending covariant interface.
Interface IExtCovariant(Of Out R)
Inherits ICovariant(Of R)
End Interface
' Implementing covariant interface.
Class Sample(Of R)
Implements ICovariant(Of R)
End Class
Sub Main()
Dim iobj As ICovariant(Of Object) = New Sample(Of Object)()
Dim istr As ICovariant(Of String) = New Sample(Of String)()
' You can assign istr to iobj because
' the ICovariant interface is covariant.
iobj = istr
End Sub
範例 2
下列範例示範如何宣告、具現化及叫用 covariant 泛型委派。 它也會示範如何使用委派類型的隱含轉換。
' Covariant delegate.
Public Delegate Function DCovariant(Of Out R)() As R
' Methods that match the delegate signature.
Public Shared Function SampleControl() As Control
Return New Control()
End Function
Public Shared Function SampleButton() As Button
Return New Button()
End Function
Private Sub Test()
' Instantiating the delegates with the methods.
Dim dControl As DCovariant(Of Control) =
AddressOf SampleControl
Dim dButton As DCovariant(Of Button) =
AddressOf SampleButton
' You can assign dButton to dControl
' because the DCovariant delegate is covariant.
dControl = dButton
' Invoke the delegate.
dControl()
End Sub