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

若為泛型型別參數,In 關鍵字會指定型別參數是 Contravariant。

備註

反變數可讓您使用比泛型參數指定的衍生程度更低的衍生類型。 這可隱含轉換實作 variant 介面的類別和隱含轉換委派類型。

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

規則

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

如果型別參數只用作方法引數類型,而不用作方法傳回型別,則可以在泛型介面或委派中宣告為 Contravariant。 ByRef 參數不可以是共變數或反變數。

參考型別支援共變數和反變數,但實值型別不支援。

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

行為

具有 Contravariant 型別參數的介面可讓其方法接受衍生程度低於介面型別參數指定之衍生類型的引數。 例如,因為在 .NET Framework 4 的 IComparer<T> 介面中,類型 T 是 Contravariant,所以您可以不使用任何特殊的轉換方法,將 IComparer(Of Person) 類型的物件指派給 IComparer(Of Employee) 類型的物件 (如果 Employee 繼承自 Person)。

您可以將類型相同但具有衍生程度較低之泛型型別參數的另一個委派指派給 Contravariant 委派。

範例 - 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 泛型委派。 它也會示範如何以隱含方式轉換委派類型。

' 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

另請參閱