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)
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节中找到关于共同和逆变的出色解释.