Как преобразовать IList‹SomeObject› в IList‹ISomeInterface›, где SomeObject реализует ISomeInterface с использованием ковариации в C# 4.0

Как преобразовать IList в IList, где SomeObject реализует ISomeInterface с использованием ковариации в C# 4.0

У меня есть что-то похожее на следующее

IList<Items> GetItems;

IList<IItems> items = GetItems() as IList<IItems>; 

но элементы равны нулю;

ответ здесь был для pre 4.0:

Преобразование массива типа T в массив типа I, где T реализует I в C#


person jimjim    schedule 09.04.2011    source источник


Ответы (3)


почему бы просто не использовать

IList<Items> GetItems;
IList<IItems> items = GetItems().Cast<IItems>().ToList(); 
person moi_meme    schedule 09.04.2011
comment
Да, почему бы и нет! Единственная причина была в том, что я не подумал об этом. TX - person jimjim; 11.04.2011

Чтобы это работало, как вы думаете, я считаю, что IList должен быть объявлен как ковариантный, а не элементы в списке. И IList не поддерживает ковариацию. Единственными интерфейсами .NET, которые были обновлены для поддержки ковариации, являются:

  • IEnumerable (T является ковариантным)
  • IEnumerator (T является ковариантным)
  • IQueryable (T является ковариантным)
  • IGrouping (TKey и TElement ковариантны)
  • IComparer (T контравариантен)
  • IEqualityComparer (T является контравариантным)
  • IComparable (T контравариантен)

Это из http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

person StellarEleven    schedule 09.04.2011

Технически следующее будет работать, но я не думаю, что это именно то, что вы ищете...

IList<IItems> items = GetItems().ToArray() as IList<IItems>;
person cwharris    schedule 09.04.2011