Share via


In (泛型修飾詞) (Visual Basic)

就泛型型別參數而言,In 關鍵字會指定型別參數為 Contravariant。

備註

Contravariance 允許您使用與泛型參數指定的型別相比,其衍生程度較小的型別。 這樣可以允許實作 Variant 介面的類別進行隱含轉換,以及委派型別的隱含轉換。

如需詳細資訊,請參閱共變數和反變數 (C# 和 Visual Basic)

規則

您可以在泛型介面及委派中使用 In 關鍵字。

如果使用型別參數做為方法引數的型別,而非做為方法傳回型別,即可在泛型介面或委派中將其宣告為 Contravariant。 ByRef 參數不能是 Covariant 或 Contravariant。

參考型別會支援共變數和 Contravariance,但是實值型別則不支援。

在 Visual Basic 中,您無法在不指定委派型別的情況下,宣告 Contravariant 介面中的事件。 此外,Contravariant 介面也不能有巢狀類別、列舉或結構,但是可以有巢狀介面。

行為

具有 Contravariant 型別參數的介面允許其方法接受與介面型別參數指定的型別相比,其衍生程度較小之型別的引數。 例如,在 .NET Framework 4 的 IComparer<T> 介面中,由於型別 T 為 Contravariant,因此只要 Person 會繼承 Employee,就可以將型別為 IComparer(Of Person) 的物件指派給型別為 IComparer(Of Employee) 的物件,而不需使用任何特別的轉換方法。

您可以將其他相同型別的委派指派給 Contravariant 委派,但是前者要有衍生程度較小的泛型型別參數。

範例

下列範例示範如何宣告、擴充和實作 Contravariant 泛型介面, 同時也示範如何在實作此介面的類別中使用隱含轉換。

' Contravariant interface.
Interface IContravariant(Of In A)
End Interface

' Extending contravariant interface.
Interface IExtContravariant(Of In A)
    Inherits IContravariant(Of A)
End Interface

' Implementing contravariant interface.
Class Sample(Of A)
    Implements IContravariant(Of A)
End Class

Sub Main()
    Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()
    Dim istr As IContravariant(Of String) = New Sample(Of String)()

    ' You can assign iobj to istr, because
    ' the IContravariant interface is contravariant.
    istr = iobj
End Sub

下列範例示範如何宣告、執行個體化和叫用 Contravariant 泛型委派, 同時也示範如何才能隱含轉換委派型別。

' Contravariant delegate.
Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)

' Methods that match the delegate signature.
Public Shared Sub SampleControl(ByVal control As Control)
End Sub

Public Shared Sub SampleButton(ByVal control As Button)
End Sub

Private Sub Test()

    ' Instantiating the delegates with the methods.
    Dim dControl As DContravariant(Of Control) =
        AddressOf SampleControl
    Dim dButton As DContravariant(Of Button) =
        AddressOf SampleButton

    ' You can assign dControl to dButton
    ' because the DContravariant delegate is contravariant.
    dButton = dControl

    ' Invoke the delegate.
    dButton(New Button())
End Sub

請參閱

參考

Out (泛型修飾詞) (Visual Basic)

概念

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