无法将IEnumerable <triangle>传递给正在寻找IEnumerable <ishape> </ishape> </triangle>的函数

时间:2011-04-17 21:01:41

标签: c# .net-3.5 interface ienumerable

我有一组对象:

 IEnumerable<Triangle>

这些对象支持接口IShape但是我在尝试将其传递给要求的函数时遇到错误:

 IEnumerable<IShape>
  1. 为什么我不能通过这个?
  2. 是否有任何解决方法可以将其中一个转换为另一个以使其正常工作?

2 个答案:

答案 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版本