In(泛型修饰符)(Visual Basic)

对于泛型类型参数,In 关键字指定该类型参数是逆变的。

备注

通过逆变,可以使用与泛型参数指定的派生类型相比,派生程度更小的类型。 这样可以对委托类型和实现变体接口的类进行隐式转换。

有关更多信息,请参见协变和逆变(C# 和 Visual Basic)

规则

可以在泛型接口和委托中使用 In 关键字。

如果类型形参仅用作方法实参类型,而不用作方法返回类型,则可以在泛型接口或委托中将该形参声明为逆变形参。 形参不能是协变或逆变形参。 ByRef 参数不能是协变或逆变的。

引用类型支持协变和逆变,而值类型不支持。

在 Visual Basic 中,只有在指定委托类型后,才能在逆变接口中声明事件。 此外,逆变接口不能有嵌套类、枚举或结构,但可以有嵌套接口。

行为

如果接口具有逆变类型形参,则允许其方法接受与接口类型形参指定的派生类型相比,派生程度更小的类型的实参。 例如,由于在 .NET Framework 4 的 IComparer<T> 接口中,类型 T 是逆变的,因此如果 Person 继承 Employee,则无需使用任何特殊转换方法,就可以将 IComparer(Of Person) 类型的对象指派给 IComparer(Of Employee) 类型的对象。

可以向逆变委托分配同一类型的其他委托,但需使用派生程度较小的泛型类型参数。

示例

下例演示如何声明、扩展和实现一个逆变泛型接口。 此外还演示了如何对实现此接口的类使用隐式转换。

' 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 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)