答案 0 :(得分:7)
他们只允许你做一些概念上有效且正式可接受的事情,但由于语言限制,目前不允许这样做。例如:
IEnumerable<int> ints = new List<int> { 1, 2, 3 };
Action<IEnumerable<object>> PrintThings =
x => { foreach(var thing in x) Console.WriteLine(thing); };
PrintThings(ints); // doesn't compile right now :( will compile in 4.0
没有根本原因,为什么这不起作用或不起作用;它恰好不允许使用该语言。通过允许它,您可以使程序员的生活更轻松,因为这样的操作对他们来说是很自然的。
答案 1 :(得分:5)
对于如何以及将在4.0中起作用,有很多误解。到目前为止,我读过的最好的解释是写了我的Marc Gravell。在这里看他的博客文章:
http://marcgravell.blogspot.com/2009/02/what-c-40-covariance-doesn-do.html
重申一下,很多人认为这将在4.0中起作用:
public class Base{}
public class Derived : Base {}
..在其他一些课程中
List<Derived> derived....
public void Method(List<Base> b){}
即使在4.0中,您也无法将List传递给此方法。正如Marc所指出的那样,那就是通用约束,并且可以从2.0开始
答案 2 :(得分:2)
在我看来,协方差带来的好处之一就是 Generics 。
我遇到过几种需要明确使用Cast
将特定类型转换为基础的情况。
class Foo { }
class Bar : Foo { }
// ...
IEnumerable<Foo> foos = new List<Foo>();
IEnumerable<Bar> bars = new List<Bar>();
foos = bars.Cast<Foo>();
// C# 4.0
foos = bars;
这是关于这个主题的good reference。
答案 3 :(得分:1)
有一篇很好的文章谈到了这个问题here。