C# 4.0将支持协变性和逆变性,但我不太清楚这个新特性的好处。您可以为我解释一下(清晰明了地)为什么需要它吗?
C# 4.0将支持协变性和逆变性。协变性允许您使用派生类作为基类,而逆变性允许您使用基类作为派生类。这些功能使得在泛型类型中传递参数更加灵活,同时保证了类型安全。因此,您可以更方便地使用泛型类型,并且代码更加简洁易懂。C# 4.0将支持协变性和逆变性,但我不太清楚这个新特性的好处。您可以为我解释一下(清晰明了地)为什么需要它吗?
C# 4.0将支持协变性和逆变性。协变性允许您使用派生类作为基类,而逆变性允许您使用基类作为派生类。这些功能使得在泛型类型中传递参数更加灵活,同时保证了类型安全。因此,您可以更方便地使用泛型类型,并且代码更加简洁易懂。它们只是允许您执行某些在概念上有效、形式上可接受的操作,但由于语言限制而目前不允许。例如:
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
这并没有根本性的原因不能或不应该工作;只是恰巧在这种语言中不被允许。如果允许它,当程序员需要执行这样的操作时,可以使他们的工作更容易。
关于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){}
在我看来,协变性将会对泛型有很大的帮助。
我遇到了几种情况,需要显式使用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;
这里有一份关于该主题的好参考资料。