Почему IEnumerable стал ковариантным в C # 4?

В более ранних версиях C # IEnumerable был определен следующим образом:

public interface IEnumerable<T> : IEnumerable

Начиная с C # 4, определение таково:

public interface IEnumerable<out T> : IEnumerable
  • Это просто для того, чтобы избавиться от раздражающих приведений в выражениях LINQ?
  • Разве это не вызовет те же проблемы, что и с string [ ] <: object [] (разбитая дисперсия массива) в C #?
  • Как было выполнено добавление ковариации с точки зрения совместимости? Будет ли предыдущий код работать в более поздних версиях .NET или здесь необходима перекомпиляция? А что насчет обратного?
  • Был ли предыдущий код, использующий этот интерфейс, строго инвариантным во всех случаях, или возможно, что некоторые варианты использования теперь будут вести себя иначе?
40
задан Mechanical snail 21 November 2012 в 07:01
поделиться