我有一组对象:
IEnumerable<Triangle>
这些对象支持接口IShape
但是我在尝试将其传递给要求的函数时遇到错误:
IEnumerable<IShape>
答案 0 :(得分:11)
在.NET 4中,应该支持这一点,因为IEnumerable<T>
被声明为协变,即声明真的是IEnumerable<out T>
。在.NET 3.5中,情况并非如此,您需要使用诸如
triangles.Cast<IShape>()
(值得注意的是,这也是语言功能的演变;也就是说,如果你能以某种方式使用C#3和.NET 4,它仍然无法工作,因为不支持共同和逆变C#直到该语言的第4版。)
可以在Jon Skeet的C# in Depth第13.3节中找到关于共同和逆变的出色解释。
答案 1 :(得分:-1)
很简单:
IEnumerable<Triangle>
不会继承,也不能分配给IEnumerable<IShape>
* 这两种类型之间没有这种关系。听起来你真的想要一个更像这样的功能:
void MyFunction<T>(IEnumerable<T> items) where T : IShape
那说,“给我一个接受任何IEnumerable<T>
的函数,其中T继承自IShape”。或者,您可以使用.Cast<T>()
扩展方法(它的性能令人惊讶)。
*在您的.Net Framework版本
上