He estado leyendo sobre los cambios que traerá .NET4.5, y en el blog this tropecé con algo que ni sabía ni entendía.¿Cómo el lenguaje C# evita que los genéricos sean covariables a menos que no contengan ningún método que requiera T como entrada?
Cuando se habla de la puesta en práctica de las colecciones de sólo lectura, Immo Landwerth dice:
Desafortunadamente, nuestro sistema de tipo no permite hacer tipos de T covariante a menos que no tiene métodos que toman T como una entrada. Por lo tanto, no podemos agregar un método IndexOf a IReadOnlyList. Creemos que esto es un pequeño sacrificio en comparación con no tener soporte para la covarianza.
Desde mi limitada comprensión, obviamente, parece que él está diciendo que para que nos permita llamar a un método que requiere una IReadOnlyList<Shape>
pasando un IReadOnlyList<Circle>
, no podemos tener un método IReadOnlyList<T>.IndexOf(T someShape)
.
No veo cómo el sistema de tipo podría evitar eso. ¿Alguien puede explicar?
Bastante. Pensé que IndexOf simplemente devolvería -1 si recibió un tipo incorrecto. No sé por qué pensé eso, eso implicaría necesitar algún tipo de comprobación de tipo en cada método. Entraré en las publicaciones de blog de eric. ¡Pero ese hombre puede explicar algo de una manera que yo pueda entender! –
Lo que una covariante 'IReadOnlyList' podría implementar sería 'IndexOf (TT it)', donde el tipo de parámetro del método era independiente del de la colección. Una clase 'List ' podría implementar su 'IndexOf' podría entonces usar un delegado generado de forma perezosa (en caché) para cada tipo' TT', de modo que si 'TItem' implementa' IEquatable .Equals' crearía un delegado a un método estático que llamaría eso, y de lo contrario crearía un delegado a un método estático que usó alguna otra comparación o, para algunas combinaciones de tipos 'TT' y' T', simplemente devolvió -1. –
supercat