Pergunta

IEnumerable<T>, IComparable<T> e mais alguns estão agora digite-variante. IList<T>, ICollection<T> e muitos outros não são. Por quê?

Foi útil?

Solução

.NET Framework 4.0 introduz segura co / contra-variância. IList<T> e ICollection<T> Tem T tanto em posições de entrada e saída, enquanto IEnumerable<T> tem T somente em posições de saída e IComparable<T> tem T somente em posições de entrada .

Suponha IList<T> suportado variância tipo:

static void FailingMethod(IList<object> list) {
    list[0] = 5;
}

static void Test() {
    var a = new List<string>();
    a[0] = "hello";
    FailingMethod(a); // if it was variant, this method call would be unsafe
}

Outras dicas

Anders Hejlseberg tem uma breve, mas esclarecedora discussão que descreve co / contravariance em sua palestra, "O Futuro do C #." Sua discussão sobre covariância e contravariance começa em 50 minutos e 17 segundos para a apresentação.

http://channel9.msdn.com/pdc2008/TL16/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top