2017-02-14 7 views
1

У меня есть следующий код, который компилируется в .NET Framework версии 4.0 и выше:производный Список в базовый IEnumerable

public abstract class MyBase { } 
public class MyDerived : MyBase { } 

public abstract class MyBaseCollection<T> : IList<T> where T : MyBase 
{ 
    protected readonly IList<T> deriveds = new List<T>(); 

    public void Test() 
    { 
     // This line works in .NET versions 4.0 and above, but not in versions below. 
     IEnumerable<MyBase> bases = deriveds; 
    } 

    #region IList members with NotImplementedException 
    // ... 
    #endregion 
} 
public class MyDerivedCollection : MyBaseCollection<MyDerived> { } 

Но в .NET Framework 4.0 ниже, я получаю ошибку компиляции на следующей строке:

IEnumerable<MyBase> bases = deriveds; 

не может неявно преобразовать тип 'System.Collections.Generic.IList <T>' в 'System.Collections.Generic.IEnumerable. Явное преобразование существует (вы лидируете листинг?)

Вопрос в том, что изменилось (или было введено) в .NET 4.0 относительно этого?
Есть ли документация об этом?

ответ

3

В .Net 4.0 интерфейс IEnumerable<T> был изменен с:

public interface IEnumerable<T>

Для public interface IEnumerable<out T>

Обратите внимание, что слово было добавлено в параметр универсального типа. Это означает, что общий параметр является ковариантным, что означает, что вы можете передать более производный тип.

Covariance Позволяет использовать более производный тип, чем первоначально указано . Вы можете назначить экземпляр IEnumerable (IEnumerable (Of Derived) в Visual Basic) к переменной типа IEnumerable

См msdn для получения дополнительной информации

2

Речь идет о ковариации и контравариантности коллекций. Для получения дополнительной информации проверьте следующее: link.

Начиная с .NET Framework 4, несколько общих интерфейсов имеют параметры типа ковариации ; например: IEnumerable, IEnumerator, IQueryable и IGrouping. Все параметры типа этих интерфейсов являются ковариантными, поэтому параметры типа используются только для возвращаемых типов элементов.

Смежные вопросы