如何将IList <someobject>转换为IList <isomeinterface>,其中SomeObject在C#4.0中使用协方差实现ISomeInterface </isomeinterface> </someobject>

时间:2011-04-09 01:54:23

标签: c#-4.0 covariance

如何将IList转换为IList,其中SomeObject在C#4.0中使用协方差实现ISomeInterface

我有类似于以下的内容

IList<Items> GetItems;

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

但是项目为空;

这里的答案是针对4.0之前的:

Converting an array of type T to an array of type I where T implements I in C#

3 个答案:

答案 0 :(得分:3)

为什么不简单地使用

IList<Items> GetItems;
IList<IItems> items = GetItems().Cast<IItems>().ToList(); 

答案 1 :(得分:2)

为了让你按照自己的想法工作,我相信IList必须被声明为协变,而不是列表中的项目。 IList不支持协方差。为支持协方差而更新的唯一.NET接口是:

  • IEnumerable(T是协变)
  • IEnumerator(T是协变)
  • IQueryable(T is covariant)
  • IGrouping(TKey和TElement是协变的)
  • IComparer(T是逆变)
  • IEqualityComparer(T是逆变)
  • IComparable(T是逆变)

来自http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

答案 2 :(得分:0)

从技术上讲,以下内容可行,但我认为这不是你想要的......

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