Digite variância em .NET Framework 4.0
-
06-09-2019 - |
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ê?
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
Veja também: O C # 4.0 covariância não fazer
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.