Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para los parámetros de tipo genérico, la In palabra clave especifica que el parámetro de tipo es contravariante.
Observaciones
Contravariance permite usar un tipo menos derivado que el especificado por el parámetro genérico. Esto permite la conversión implícita de clases que implementan interfaces variantes y conversión implícita de tipos delegados.
Para obtener más información, vea Covarianza y Contravarianza.
Reglas
Puede usar la In palabra clave en interfaces y delegados genéricos.
Un parámetro de tipo se puede declarar contravariante en una interfaz genérica o delegado si solo se usa como un tipo de argumentos de método y no se usa como un tipo de valor devuelto de método.
ByRef los parámetros no pueden ser covariantes ni contravariantes.
La covarianza y la contravarianza se admiten para los tipos de referencia y no se admiten para los tipos de valor.
En Visual Basic, no se pueden declarar eventos en interfaces contravariantes sin especificar el tipo de delegado. Además, las interfaces contravariantes no pueden tener clases anidadas, enumeraciones o estructuras, pero pueden tener interfaces anidadas.
Comportamiento
Una interfaz que tiene un parámetro de tipo contravariante permite a sus métodos aceptar argumentos de tipos menos derivados que los especificados por el parámetro de tipo de interfaz. Por ejemplo, dado que en .NET Framework 4, en la IComparer<T> interfaz, el tipo T es contravariante, puede asignar un objeto del IComparer(Of Person) tipo a un objeto del IComparer(Of Employee) tipo sin usar ningún método de conversión especial si Employee hereda de Person.
A un delegado contravariante se le puede asignar otro delegado del mismo tipo, pero con un parámetro de tipo genérico menos derivado.
Ejemplo: interfaz genérica contravariante
En el ejemplo siguiente se muestra cómo declarar, extender e implementar una interfaz genérica contravariante. También muestra cómo puede usar la conversión implícita para las clases que implementan esta interfaz.
' 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
Ejemplo: delegado genérico contravariante
En el ejemplo siguiente se muestra cómo declarar, crear instancias e invocar un delegado genérico contravariante. También muestra cómo puede convertir implícitamente un tipo de delegado.
' 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