Saltar al contenido

Covarianza y Contravarianza para C#

El siguiente problema gira en torno a los servidores y los dispositivos de red. Digamos que tienes una lista de dispositivos que tienen nombres y estados. Cuando haga una lista, incluya los dispositivos que pretende procesar y asegúrese de que los dispositivos tienen nombres y estados únicos.

Aquí hay una demostración de covarianza:

Covarianza y Contravarianza para C#
Covarianza y Contravarianza para C#
1List<Dispositivos; interruptores =GetSwitches();

csharp

Con C# 3.0, esto no se compilará ya que el compilador no puede averiguar lo que puedes o no puedes hacer con la colección de interruptores después de tenerla. Nada le impediría añadir un servidor a su colección, lo que significa que no se garantiza que no ocurra lo siguiente.

1switches.Add(newServer("Domain Controller", "up"));

csharp

El compilador se niega a compilar el código. Esto demuestra contravarianza.

En el siguiente ejemplo, el compilador permitirá el código, aunque el método devuelva List. Esto se debe a que todos los interruptores son dispositivos.

12List<Switch;;switches=GetAccess();switches.Add(newSwitch("DC-CORE-1", "up"));

csharp

Podemos cambiar de tipo.

12List<Dispositivos;interruptores=GetAccess();interruptores.Add(newSwitch("DC-CORE-1", "up"));

csharp

Sin embargo, esto también es ambiguo porque también podría significar lo siguiente:

12List<Switch;;switches =GetAccess();Switch dccore = switches[0];

csharp

La versión 4.0 introdujo dos nuevas palabras clave: dentro y fuera . Se refieren al tipo de argumentos que se pueden colocar en ciertas posiciones. El in marca la posición de entrada, el out marca la posición de salida.

Esto nos permite codificar nuestras intenciones originales.

1IEnumerable<Dispositivos; dispositivos =GetSwitches();

csharp

La Lista tiene tanto la fuera como en direcciones, lo que significa que no es ni co- ni contra-variante. Toma lo siguiente:

123interfaceIOnlyDevices<in T>{voidAdd(Tvalue);}

csharp

La sencilla interfaz permite hacer lo siguiente:

12IOnlyDevices<Switch;;switches=GetAccess();switches.Add(newSwitch("DC-CORE-1", "up"));

csharp

Así que ahora la última declaración es segura e inequívoca.