Поделиться через


In (Generic Modifier) (Visual Basic)

Для параметров универсального типа ключевое In слово указывает, что параметр типа является контравариантным.

Замечания

Контравариантность позволяет использовать менее производный тип, чем указанный универсальным параметром. Это позволяет неявное преобразование классов, реализующих вариантные интерфейсы и неявное преобразование типов делегатов.

Дополнительные сведения см. в разделе Ковариантность и контравариантность.

Правила

Ключевое In слово можно использовать в универсальных интерфейсах и делегатах.

Параметр типа может быть объявлен контравариантным в универсальном интерфейсе или делегате, если он используется только в качестве типа аргументов метода и не используется в качестве возвращаемого типа метода. ByRef параметры не могут быть ковариантными или контравариантными.

Ковариация и контравариантность поддерживаются для ссылочных типов и не поддерживаются для типов значений.

В Visual Basic нельзя объявлять события в контравариантных интерфейсах без указания типа делегата. Кроме того, контравариантные интерфейсы не могут содержать вложенные классы, перечисления или структуры, но могут иметь вложенные интерфейсы.

Поведение

Интерфейс с параметром контрвариантного типа позволяет своим методам принимать аргументы менее производных типов, чем указанные параметром типа интерфейса. Например, так как в .NET Framework 4 в интерфейсе IComparer<T> тип T является контравариантным, можно назначить объект IComparer(Of Person) типа объекту IComparer(Of Employee) типа без использования специальных методов преобразования, если Employee наследуется от Person.

Делегат контравариантного типа может быть назначен другим делегатом того же типа, но с менее производным параметром универсального типа.

Пример — универсальный интерфейс 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

См. также