无法将IEnumerable <Triangle>传递给正在寻找IEnumerable <IShape>的函数

leo*_*ora 2 c# ienumerable interface .net-3.5

我有一组对象:

 IEnumerable<Triangle>
Run Code Online (Sandbox Code Playgroud)

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

 IEnumerable<IShape>
Run Code Online (Sandbox Code Playgroud)
  1. 为什么我不能通过这个?
  2. 是否有任何解决方法将一个转换为另一个以使其工作?

Dom*_*nic 11

在.NET 4中,应该支持这一点,因为IEnumerable<T>声明是协变的,即声明是真的IEnumerable<out T>.在.NET 3.5中,情况并非如此,您需要使用诸如此类的解决方法

triangles.Cast<IShape>()
Run Code Online (Sandbox Code Playgroud)

(值得注意的是,这也是语言功能的演变;也就是说,如果你能以某种方式使用C#3和.NET 4,那么它仍然无法工作,因为在版本之前没有向C#添加对共同和逆变的支持4种语言.)

可以在Jon Skeet的C#深度,第13.3节中找到关于共同和逆变的出色解释.