协方差和逆变有什么好处?

时间:2009-04-29 15:47:12

标签: c# covariance contravariance

C#4.0将支持协方差和逆变。但我不清楚这个新功能的好处。你能(明确地)解释我为什么需要它吗?

4 个答案:

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