2010-08-27 16 views
5

Antes de que saliera C# 4.0, estaba bastante entusiasmado con la covarianza y la contravariancia. Me complació mi afición por la corrección teórica.Ejemplos de buenos casos de uso de la vida real para la covarianza y la contravarianza en C# 4.0?

Sin embargo, ahora que está fuera, y he vuelto a escribir el código normal, todos los días, aburrido, me estoy empezando a preguntar: ¿alguna vez lo usé? Y noto que no lo he usado conscientemente. Ninguna de las interfaces o delegados que he definido se han beneficiado de ella.

Sólo hay un caso único en el que más tarde descubrí que inconscientemente usé la covarianza, pero es muy sutil y podría haberlo notado. Imagínese X es una clase base y Y es un descendiente de la misma:

if (enumerableOfYs.Contains(variableOfTypeX)) 

¿Hay ejemplos interesantes o emocionantes, donde cualquiera de ustedes han utilizado covarianza o contravarianza en la vida real, no artificial uso- caso y realmente ha salvado el día siendo espectacularmente "correcto"?

+5

¿Quieres decir además de cosas como 'IEnumerable ', 'Func', y' IComparable 'que probablemente utilizas todos los días sin darte cuenta? – Gabe

Respuesta

8

El único uso del "mundo real" de la varianza que me he encontrado en mis programas de escritura-en-para-clientes reales (en oposición a la escritura de casos de prueba compilador o artículos o lo que sea) es ahora puedo pasar una IEnumerable<TypeParameterDefinedInSource> a un método que espera un IEnumerable<TypeSymbol> cuando escribo herramientas de análisis de código en C#.

Realmente no es un tipo de función de "salvar el día". Es más una característica de "funciona de la manera en que lo espero".

+0

Hola, Eric. Gracias por tu respuesta. Sin embargo, esto me lleva a una pregunta más general: ¿cómo prioriza el equipo C# las características? ¿Por qué una característica que no "salva el día" tiene tanta más prioridad que las características que * tanto * "guardan el día" * como también "hacen que las cosas funcionen como yo esperaba"? (por ejemplo, atributos personalizados genéricos, bloques de iteradores anónimos, etc.) – Timwi

+3

@Timwi: Priorizamos funciones basadas en una larga lista de criterios competitivos, incluidos factores como la dificultad de implementación, qué tan bien funciona con o contra otras características, si encaja en el tema más amplio para el lanzamiento, y así sucesivamente. La varianza fue fácil; sabíamos cómo implementarlo, ya estaba soportado en el CLR, entendemos la teoría muy bien y eliminó un problema genuino del cliente que se informa todo el tiempo. Una característica más grande habría quitado demasiados recursos de hacer un trabajo "dinámico" que era el bit de mayor orden para el lanzamiento. –

+0

Creo que "Es más de un" funciona de la manera en que lo espero "característica" es la clave de la forma en que es tan útil. –

1

Las características como la covarianza y la contravarianza realmente no "salvan el día". Por el contrario, cuando se usan correctamente, facilitan el mantenimiento posterior. De esta manera, es muy parecido a la corrección const en C++. No agrega ningún poder, pero el código escrito correctamente lo usa y hace que el sistema sea mucho más fácil de usar.

NOTA: No he utilizado todavía, porque Acabo de actualizar a VS 2010.

+0

Hm, no estoy de acuerdo. Const en C++ es una restricción. La covarianza/contravarianza es lo opuesto, es una habilidad extra. – Timwi

+0

@Timwi, sí, ese es un buen punto. Agrega mucho valor. Estaba equivocado. – tster

0

Solía ​​C# durante unos tres años, y sólo recuerdo haber "perdido" varianza cuenta con tal vez una o dos veces.

Es posible que ahora que están en el idioma, voy a encontrar más oportunidades para aprovecharlos, pero creo que son características 'menores' en el mejor de los casos.

(estoy interesado en ver qué otras respuestas aparecen aquí.)

3

vi la excelente serie de video de dos partes sobre covarianza y contravarianza por Eric Lippert, uno de los diseñadores de la función. Los videos contienen la explicación más clara que puedo encontrar sobre cómo funciona la característica; sin embargo, los ejemplos están ideados para la demostración.

que se agradece especialmente la discusión de Eric al final del segundo video sobre cuando se espera que los usuarios podrían utilizar la función. Indicó que la mayoría de los desarrolladores de aplicaciones de línea de negocio probablemente no crearían muchas interfaces que empleen covarianza o contravarianza, sino que es más probable que sea la función de un desarrollador de infraestructura (incluidos sus propios marcos, por supuesto).

Por otro lado, finalmente puedo colocar un IEnumerable<DerivedClass> en un método que espera un IEnumerable<BaseClass> sin saltar a través del tipo aros de fundición. Eventualmente, probablemente me olvide de que nunca podría. Creo que este será el uso más convincente y común de la covarianza/contravarianza: cosas súper sutiles que funcionan cuando, en versiones anteriores de .NET, no lo hacían.

Cuestiones relacionadas