Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Для параметров Out
универсального типа ключевое слово указывает, что тип является ковариантным.
Замечания
Ковариация позволяет использовать более производный тип, чем указанный универсальным параметром. Это позволяет неявное преобразование классов, реализующих вариантные интерфейсы и неявное преобразование типов делегатов.
Дополнительные сведения см. в разделе Ковариантность и контравариантность.
Правила
Ключевое Out
слово можно использовать в универсальных интерфейсах и делегатах.
В универсальном интерфейсе параметр типа может быть объявлен ковариантным, если он удовлетворяет следующим условиям:
Параметр типа используется только в качестве возвращаемого типа методов интерфейса и не используется в качестве типа аргументов метода.
Замечание
Существует одно исключение из этого правила. Если в ковариантном интерфейсе у вас есть контравариантный универсальный делегат в качестве параметра метода, можно использовать ковариантный тип в качестве параметра универсального типа для этого делегата. Дополнительные сведения о ковариантных и контрвариантных универсальных делегатах см. в разделе " Вариативность" в делегатах и использовании вариативности для func и Action Generic Delegates.
Параметр типа не используется в качестве универсального ограничения для методов интерфейса.
В универсальном делегате параметр типа может быть объявлен ковариантным, если он используется только в качестве типа возвращаемого метода и не используется для аргументов метода.
Ковариантность и контравариантность поддерживаются для ссылочных типов, но они не поддерживаются для типов значений.
В Visual Basic нельзя объявлять события в ковариантных интерфейсах без указания типа делегата. Кроме того, ковариантные интерфейсы не могут содержать вложенные классы, перечисления или структуры, но они могут иметь вложенные интерфейсы.
Поведение
Интерфейс с параметром ковариантного типа позволяет методам возвращать более производные типы, чем указанные параметром типа. Например, так как в .NET Framework 4 тип IEnumerable<T>T является ковариантным, можно назначить объект IEnumerable(Of String)
типа объекту IEnumerable(Of Object)
типа типа без использования специальных методов преобразования.
Ковариантный делегат может быть назначен другим делегатом того же типа, но с более производным параметром универсального типа.
Пример 1
В следующем примере показано, как объявить, расширить и реализовать ковариантный универсальный интерфейс. В нем также показано, как использовать неявное преобразование для классов, реализующих ковариантный интерфейс.
' 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
Пример 2
В следующем примере показано, как объявить, создать экземпляр и вызвать ковариантный универсальный делегат. В нем также показано, как использовать неявное преобразование для типов делегатов.
' 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