C# 4.0 将支持协变和逆变。但我并不清楚这个新功能的好处。你能解释一下(清楚地)我们为什么需要它吗?
问问题
2301 次
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 回答