¿Cómo se implementa la covarianza y contra varianza genéricas en C # 4.0?

No asistí a PDC 2008, pero escuché algunas noticias de que C # 4.0 se anuncia para admitir la covarianza y la contravariancia genéricas. Es decir, List se puede asignar a List . ¿Cómo es posible?

En el libro de Jon Skeet, C # in Depth , se explica por qué los generics C # no admiten la covarianza y la contravariancia. Es principalmente para escribir código de seguridad. Ahora, C # 4.0 cambió para darles soporte. ¿Traería caos?

¿Alguien sabe que los detalles sobre C # 4.0 pueden dar alguna explicación?

La varianza solo se admitirá de forma segura , de hecho, utilizando las capacidades que ya tiene el CLR. Por lo tanto, los ejemplos que doy en el libro de intentar usar una List como una List (o lo que sea) todavía no funcionarán, pero sí lo harán algunos otros escenarios.

En primer lugar, solo será compatible con interfaces y delegates.

En segundo lugar, requiere que el autor de la interfaz / delegado decore los parámetros de tipo como in (para contravarianza) o out (para covarianza). El ejemplo más obvio es IEnumerable que solo le permite sacar valores de él, no le permite agregar otros nuevos. Eso se convertirá en IEnumerable . Eso no afecta en absoluto a la seguridad del tipo, pero le permite devolver un IEnumerable de un método declarado para devolver IEnumerable por ejemplo.

La contradicción es más difícil de dar ejemplos concretos para el uso de interfaces, pero es fácil con un delegado. Considera Action – eso solo representa un método que toma un parámetro T Sería bueno poder convertir a la perfección el uso de un Action Action como una Action ; cualquier método que tome un parámetro de object va a estar bien cuando se presente con una string . Por supuesto, C # 2 ya tiene covarianza y contravariancia de delegates hasta cierto punto, pero a través de una conversión real de un tipo de delegado a otro (creando una nueva instancia) – vea P141-144 para ejemplos. C # 4 lo hará más genérico y (creo) evitará crear una nueva instancia para la conversión. (En su lugar, será una conversión de referencia).

Espero que esto lo aclare un poco, por favor avíseme si no tiene sentido.

No es que Jon todavía no lo haya cubierto, pero aquí hay algunos enlaces a blogs y videos de Eric Lippert. Él hace un buen trabajo de explicarlo con ejemplos.

https://blogs.msdn.microsoft.com/ericlippert/2007/10/16/covariance-and-contravariance-in-c-part-one/

Los videos:

https://www.youtube.com/watch?v=3MQDrKbzvqU

https://www.youtube.com/watch?v=XRIadQaBYlI

https://www.youtube.com/watch?v=St9d2EDZfrg