16

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

4

4 回答 4

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

没有根本原因为什么这不起作用或不应该起作用;它只是碰巧在语言中是不允许的。通过允许它,您可以让程序员的生活更轻松,因为这样的操作对他们来说是很自然的。

于 2009-04-29T15:55:08.897 回答
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 开始

于 2009-04-29T16:01:17.010 回答
2

在我看来,协方差将有很大帮助的好处之一是泛型

我遇到了几种需要显式使用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;

这是关于这个主题的一个很好的参考

于 2009-04-29T16:04:11.763 回答
1

有一篇很好的文章在这里讨论了这个问题。

于 2009-04-29T15:59:25.033 回答