C# 4.0 va a admitir la covarianza y la contravarianza. Pero no entiendo claramente los beneficios de esta nueva característica. ¿Puedes explicarme (claramente) por qué lo necesitamos?¿Cuáles son los beneficios de la covarianza y la contravarianza?
Respuesta
Simplemente le permiten hacer algunas cosas que son conceptualmente válidas y formalmente aceptables, pero que actualmente no se permiten debido a restricciones de idioma. Por ejemplo:
IEnumerable<int> ints = new List<int> { 1, 2, 3 };
Action<IEnumerable<object>> PrintThings =
x => { foreach(var thing in x) Console.WriteLine(thing); };
PrintThings(ints); // doesn't compile right now :( will compile in 4.0
No existe una razón fundamental por la que esto no funcione o no funcione; simplemente no está permitido en el idioma. Al permitirlo, usted facilita la vida de los programadores cuando tal operación sería natural para ellos.
La razón fundamental por la cual lo anterior no funcionará antes de 4.0 es que no hay forma en la sintaxis de permitirlo sin perder seguridad de tipo. Si lo permite para su ejemplo, necesariamente también le permitirá ejemplos donde no se preserva la seguridad del tipo. – Eddie
Correcto, y es por eso que están agregando las nuevas palabras clave "in" y "out" para admitirlo (y IEnumerable
Hay un buen escrito que habla sobre este tema here.
Hay muchos conceptos erróneos sobre cómo y qué funcionará en 4.0. La mejor explicación que he leído hasta ahora fue escrita por Marc Gravell. Ver su blog aquí:
http://marcgravell.blogspot.com/2009/02/what-c-40-covariance-doesn-do.html
Sólo para reiterar, una gran cantidad de gente en que esto va a funcionar en 4.0:
public class Base{}
public class Derived : Base {}
..en alguna otra clase
List<Derived> derived....
public void Method(List<Base> b){}
Incluso en 4.0, no podrá pasar la Lista a este método. Como Marc señala, eso es lo que las limitaciones genéricas están ahí para, y se puede hacer desde el 2,0
Esto me parece un extraño no sequitur. La única razón por la que no puede pasar la Lista es porque las Listas son mutables; por supuesto, no puede pasar de esa manera, ya que agregarle elementos rompería las restricciones de tipo en él. – mquander
@mquander: ¿Un extraño no sequitur? La API (pre 4.0) no tiene nada que decir, "puedes hacer esta operación solo si el objeto es inmutable". – Eddie
Mi punto es simplemente que el hecho de que la Lista
Uno de los beneficios que, en mi opinión, covarianza va a ayudar mucho es con Genéricos.
Encontré varias situaciones donde uno necesita explícitamente usar Cast
a convertir un tipo específico a su base.
class Foo { }
class Bar : Foo { }
// ...
IEnumerable<Foo> foos = new List<Foo>();
IEnumerable<Bar> bars = new List<Bar>();
foos = bars.Cast<Foo>();
// C# 4.0
foos = bars;
Aquí hay una good reference sobre el tema.
Aún así, el uso excesivo de cursivas fue un buen toque. – bzlm
Lo siento :(se olvidó de la clase def –
- 1. .NET: Covarianza y contravarianza
- 2. GAE y Django: ¿Cuáles son los beneficios?
- 3. Covarianza y contravarianza en lenguajes de programación
- 4. C# genéricos de lanzamiento (¿covarianza y contravarianza?)
- 5. delegados de acción, los genéricos, covarianza y contravarianza
- 6. ¿Cuáles son los beneficios de JCA?
- 7. ¿Cuáles son los beneficios de Persistence Ignorance?
- 8. ¿Cuáles son los beneficios de JRebel?
- 9. ¿Cuáles son los beneficios de letrec?
- 10. ¿Cuáles son los mayores beneficios de LLVM?
- 11. ¿Cuáles son los beneficios de eliminar la fragmentación de IPv6?
- 12. ¿Cuáles son los verdaderos beneficios de ExpandoObject?
- 13. ¿Cuáles son los beneficios de Java?
- 14. ¿Cuáles son los beneficios de Scala?
- 15. ¿Cuáles son los beneficios de la programación funcional?
- 16. ¿Cuáles son los beneficios de la sesión por conversación?
- 17. ¿Cuáles son los beneficios de usar WCF?
- 18. ¿Cuáles son los beneficios de corutinas?
- 19. ¿Demuestra covarianza y contravarianza en Java?
- 20. ¿alguien podría explicar la conexión entre el tipo de covarianza/contravarianza y la teoría de categorías?
- 21. C#: ¿Es la varianza (covarianza/contravarianza) otra palabra para polimorfismo?
- 22. Covarianza/Contravarianza con una expresión linq
- 23. interfaces de C# Covarianza y contravarianza al implementar
- 24. ¿Cuáles son los beneficios de usar Clases en VBA?
- 25. ¿Cuáles son los beneficios de usar propiedades internamente?
- 26. ¿Cuáles son los principales beneficios de ingresar a WPF?
- 27. ¿Cuáles son los beneficios de Windows Certificate Store?
- 28. ¿Cuáles son los beneficios de utilizar un iterador en Java
- 29. C# - ¿Cuáles son los beneficios de las clases "parciales"?
- 30. ¿Cuáles son los beneficios de usar Scala en .Net?
[Covarianza vs contravariancia] (http://izlooite.blogspot.com/2011/04/covariance-and-contravariance.html) –
Bart De Smet tiene una gran entrada de blog sobre covarianza y contravarianza [aquí] (http: //bartdesmet.net/blogs/bart/archive/2009/04/13/c-4-0-feature-focus-part-4-generic-co-and-contra-variance-for-delegate-and-interface- types.aspx). –