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


Ковариантность и контравариантность (Visual Basic)

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

В следующем коде показано различие между совместимостью назначений, ковариантностью и контравариантностью.

' Assignment compatibility.
Dim str As String = "test"
' An object of a more derived type is assigned to an object of a less derived type.
Dim obj As Object = str

' Covariance.
Dim strings As IEnumerable(Of String) = New List(Of String)()
' An object that is instantiated with a more derived type argument
' is assigned to an object instantiated with a less derived type argument.
' Assignment compatibility is preserved.
Dim objects As IEnumerable(Of Object) = strings

' Contravariance.
' Assume that there is the following method in the class:
' Shared Sub SetObject(ByVal o As Object)
' End Sub
Dim actObject As Action(Of Object) = AddressOf SetObject

' An object that is instantiated with a less derived type argument
' is assigned to an object instantiated with a more derived type argument.
' Assignment compatibility is reversed.
Dim actString As Action(Of String) = actObject

Ковариация для массивов обеспечивает неявное преобразование массива более производного типа в массив менее производного типа. Но эта операция не является безопасной, как показано в следующем примере кода.

Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception.
' array(0) = 10

Поддержка ковариации и контравариации для групп методов позволяет сопоставлять сигнатуры методов с типами делегатов. Это сопоставление позволяет назначать делегату не только метод, имеющий соответствующую сигнатуру, но и метод, который:

  • Возвращает более производный тип (ковариантность), чем возвращаемый тип, указанный типом делегата.
  • Принимает параметры, имеющие менее производные типы (контравариантность), чем те, которые указаны типом делегата.

Дополнительные сведения см. в разделе "Ковариантность в Делегатах (Visual Basic)" и "Использование ковариантности в Делегатах (Visual Basic)".

В следующем примере кода показана поддержка ковариации и контравариации для групп методов.

Shared Function GetObject() As Object
    Return Nothing
End Function

Shared Sub SetObject(ByVal obj As Object)
End Sub

Shared Function GetString() As String
    Return ""
End Function

Shared Sub SetString(ByVal str As String)

End Sub

Shared Sub Test()
    ' Covariance. A delegate specifies a return type as object,
    ' but you can assign a method that returns a string.
    Dim del As Func(Of Object) = AddressOf GetString

    ' Contravariance. A delegate specifies a parameter type as string,
    ' but you can assign a method that takes an object.
    Dim del2 As Action(Of String) = AddressOf SetObject
End Sub

В .NET Framework 4 или более поздней версии Visual Basic поддерживает ковариацию и контравариацию в универсальных интерфейсах и делегатах и позволяет неявное преобразование параметров универсального типа. Для получения более подробной информации см. Вариативность в универсальных интерфейсах (Visual Basic) и Вариативность в делегатах (Visual Basic).

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

Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings

Универсальный интерфейс или делегат называется вариантом , если его универсальные параметры объявлены ковариантными или контравариантными. Visual Basic позволяет создавать собственные вариантные интерфейсы и делегаты. Дополнительные сведения см. в разделе "Создание вариантных универсальных интерфейсов" (Visual Basic) и "Вариативность в делегатах" (Visual Basic).

Название Описание
Вариантность в универсальных интерфейсах (Visual Basic) Обсуждает ковариантность и контравариантность в универсальных интерфейсах и предоставляет список вариантов универсальных интерфейсов в .NET Framework.
Создание универсальных интерфейсов (Visual Basic) Показывает, как создавать интерфейсы пользовательских вариантов.
Использование дисперсии в интерфейсах для универсальных коллекций (Visual Basic) Показывает, как поддержка ковариации и контравариации в IEnumerable<T>IComparable<T> интерфейсах помогает повторно использовать код.
Вариативность в делегатах (Visual Basic) Обсуждает ковариацию и контравариантность в обобщённых и необобщённых делегатах и предоставляет список вариантов обобщённых делегатов в .NET Framework.
Использование дисперсии в делегатах (Visual Basic) Показывает, как использовать поддержку ковариации и контравариации в необобщённых делегатах для соответствия подписей методов типам делегатов.
Использование вариативности для Func и универсальных делегатов действий (Visual Basic) Показывает, как поддержка ковариации и контравариации в Func и Action делегатах может помочь повторно использовать код.