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.
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.
VB
' Contravariant interface.Interface IContravariant(OfIn A)
EndInterface' Extending contravariant interface.Interface IExtContravariant(OfIn A)
Inherits IContravariant(Of A)
EndInterface' Implementing contravariant interface.Class Sample(Of A)
Implements IContravariant(Of A)
EndClassSub Main()
Dim iobj As IContravariant(OfObject) = New Sample(OfObject)()
Dim istr As IContravariant(OfString) = New Sample(OfString)()
' You can assign iobj to istr, because' the IContravariant interface is contravariant.
istr = iobj
EndSub
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.
VB
' Contravariant delegate.PublicDelegateSub DContravariant(OfIn A)(ByVal argument As A)
' Methods that match the delegate signature.PublicSharedSub SampleControl(ByVal control As Control)
EndSubPublicSharedSub SampleButton(ByVal control As Button)
EndSubPrivateSub 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())
EndSub
Eduki honen iturburua GitHub-en aurki daiteke, bertan arazoak eta aldaketak egiteko eskaerak sortu eta berrikus ditzakezu. Informazio gehiagorako, ikusi gure kolaboratzaileen gida.
.NET oharrak
.NET iturburu irekiko proiektu bat da. Hautatu esteka bat oharrak bidaltzeko:
Bat egin IAren soluzio eskalagarrien soluzioak sortzeko topaketa sortarekin, mundu errealaren erabilera-kasuetan oinarrituak, beste garatzaile eta aditu batzuekin.