Разница типов в .NET Framework 4.0
-
06-09-2019 - |
Вопрос
IEnumerable<T>
, IComparable<T>
и еще несколько теперь имеют варианты типа. IList<T>
, ICollection<T>
а многие другие нет.Почему?
Решение
.NET Framework 4.0 представляет безопасный ко/контравариация. IList<T>
и ICollection<T>
иметь T
как во входном, так и в выходном положении, в то время как IEnumerable<T>
имеет T
только в выходных положениях и IComparable<T>
имеет T
только во входных позициях.
Предполагать IList<T>
поддерживаемая вариация типа:
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
}
Другие советы
Смотрите также: Что такое ковариация в C# 4.0? не делает делать
У Андерса Хейлсеберга есть краткое, но осветительное обсуждение, которое описывает Co/Contravariance в его выступлении «будущее C#». Его дискуссия о ковариации и противоположности начинается через 50 минут и 17 секунд до презентации.