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


Out (универсальный модификатор) (Visual Basic)

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

Заметки

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

Дополнительные сведения см. в разделе Ковариация и контравариация (C# и Visual Basic).

Правила

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

В универсальном интерфейсе параметр типа может быть объявлен ковариантным, если он удовлетворяет следующим условиям:

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

    Примечание

    Существует одно исключение из данного правила.Если в ковариантном интерфейсе в качестве параметра метода используется контравариантный универсальный делегат, ковариантный тип можно использовать в качестве параметра универсального типа для этого делегата.Дополнительные сведения о ковариантных и контравариантных универсальных делегатах см. в разделах Вариативность в делегатах (C# и Visual Basic) и Использование вариативности в универсальных методах-делегатах Func и Action (C# и Visual Basic).

  • Параметр типа не используется в качестве универсального ограничения для методов интерфейса.

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

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

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

Поведение

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

Ковариантный делегат может быть назначен другому делегату того же типа, но с производным параметром универсального типа большей глубины наследования.

Пример

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

' Covariant interface.
Interface ICovariant(Of Out R)
End Interface

' Extending covariant interface.
Interface IExtCovariant(Of Out R)
    Inherits ICovariant(Of R)
End Interface

' Implementing covariant interface.
Class Sample(Of R)
    Implements ICovariant(Of R)
End Class

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

    ' You can assign istr to iobj because
    ' the ICovariant interface is covariant.
    iobj = istr
End Sub

В следующем примере показано, как объявить ковариантный универсальный делегат, создать его экземпляр и вызвать его. В нем также показано, как применять неявное преобразование к типам делегатов.

' Covariant delegate.
Public Delegate Function DCovariant(Of Out R)() As R

' Methods that match the delegate signature.
Public Shared Function SampleControl() As Control
    Return New Control()
End Function

Public Shared Function SampleButton() As Button
    Return New Button()
End Function

Private Sub Test()

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

    ' You can assign dButton to dControl
    ' because the DCovariant delegate is covariant.
    dControl = dButton

    ' Invoke the delegate.
    dControl()
End Sub

См. также

Ссылки

In (универсальный модификатор) (Visual Basic)

Основные понятия

Вариативность в универсальных интерфейсах (C# и Visual Basic)