varianza positiva finanzas definicion covarianza correlacion como calcular c# c#-4.0 covariance

positiva - Pregunta sobre la covarianza de C#



covarianza y correlacion (4)

En el código a continuación:

interface I1 { } class CI1: I1 { } List<CI1> listOfCI1 = new List<CI1>(); IEnumerable<I1> enumerableOfI1 = listOfCI1; //this works IList<I1> listofI1 = listOfCI1; //this does not

Puedo asignar mi "listOfCI1" a un IEnumerable<I1> (debido a la covarianza)

¿Pero por qué no puedo asignarlo a un IList<I1> ? Para el caso, ni siquiera puedo hacer lo siguiente:

List<I1> listOfI12 = listOfCI1;

¿No debería la covarianza permitirme asignar un tipo derivado a un tipo base?


Compare declaraciones (msdn)

public interface IEnumerable<out T> : IEnumerable public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

¿Ves esa palabra mágica? Esto significa que la covarianza está activada.


No.

De lo contrario, podría agregar una implementación diferente de I1 a una lista que solo debería contener C1 s.


IList<T> interfaz IList<T> no es covariante.


En pocas palabras, IList<T> no es covariante, mientras que IEnumerable<T> es. Este es el por qué...

Supongamos que IList<T> era covariante. El código siguiente claramente no es seguro para tipos ... pero ¿dónde quieres que sea el error?

IList<Apple> apples = new List<Apple>(); IList<Fruit> fruitBasket = apples; fruitBasket.Add(new Banana()); // Aargh! Added a Banana to a bunch of Apples! Apple apple = apples[0]; // This should be okay, but wouldn''t be

Para obtener muchos detalles sobre la varianza, vea la publicación de blogs de Eric Lippert, o vea el video de mi charla sobre la variación de NDC.

Básicamente, la variación solo se permite cuando se garantiza que es segura (y de forma conservadora, por lo que no se puede convertir IEnumerable<int> en IEnumerable<object> - la conversión de boxeo no conserva la representación).