In (Modificador genérico) (Visual Basic)
Para los parámetros de tipo genérico, la palabra clave In
especifica que el parámetro de tipo es contravariante.
Comentarios
La contravarianza permite usar un tipo menos derivado que el que se especifica en el parámetro genérico. Esto permite la conversión implícita de las clases que implementan interfaces variantes y la conversión implícita de los tipos de delegado.
Para obtener más información, vea Covarianza y contravarianza.
Reglas
Puede usar la palabra clave In
en las interfaces y delegados genéricos.
Un parámetro de tipo se puede declarar contravariante en una interfaz o delegado genéricos si solo se usa como tipo de argumentos de método y no se usa como tipo de un valor devuelto de un método. los parámetros ByRef
no pueden ser covariantes ni contravariantes.
La covarianza y la contravarianza son compatibles con los tipos de referencia, pero no con los tipos de valor.
En Visual Basic, no se pueden declarar eventos en interfaces de contravariante sin especificar el tipo delegado. Además, las interfaces de contravariante no pueden tener clases, enumeraciones o estructuras anidadas, pero pueden tener interfaces anidadas.
Comportamiento
Una interfaz que tiene un parámetro de tipo contravariante permite que sus métodos acepten argumentos de tipos menos derivados que los que se especifican en el parámetro de tipo de interfaz. Por ejemplo, dado que en la interfaz de IComparer<T> de .NET Framework 4 el tipo T es contravariante, puede asignar un objeto del tipo IComparer(Of Person)
a un objeto de tipo IComparer(Of Employee)
sin tener que usar ningún método de conversión especial si Employee
se 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 se 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 e invocar un delegado genérico contravariante, y crear instancias de este. También se 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