我在Channel 9上看了一段关于IT技术的视频,但我并没有很好地理解它。
请问有人能够给我一个简单易懂的例子吗?之后或许能够说明这在实践中如何应用?
我在Channel 9上看了一段关于IT技术的视频,但我并没有很好地理解它。
请问有人能够给我一个简单易懂的例子吗?之后或许能够说明这在实践中如何应用?
你可能想看一下这篇博客,他非常好地解释了这个问题,但我认为需要更多的例子来帮助人们理解,因为这涉及到一个非常难以理解的领域,但是文章中下面的引用很好地总结了这个问题。
http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html
“协变性和逆变性”意味着当安全时,您现在可以传递不精确的通用类型,就像在安全时可以传递不精确的参数类型一样。Tiger
是一种动物
,因此它可以做任何动物
能做的事情。如果我有一个要求动物
的方法,我也可以传入一个Tiger
。
协变性 - 传递更具体的类型参数
这是您最熟悉的方向。我可以将IEnumerable<Tiger>
传递到任何期望IEnumerable<Animal>
的地方。
static void ListAnimals(IEnumerable<Animal> animals)
{
}
List<Tiger> tigers = new List<Tiger>();
ListAnimals(tigers);
static void CompareTigers(IComparer<Tiger> comparer, Tiger tiger1, Tiger tiger2)
{
comparer.Compare(tiger1, tiger2);
}
// normal - a tiger comparer can compare two tigers
IComparer<Tiger> tigerComparer = null;
CompareTigers(tigerComparer, new Tiger(), new Tiger());
// contravariance - an animal comparer can ALSO compare two tigers
IComparer<Animal> animalComparer = null;
CompareTigers(animalComparer, new Tiger(), new Tiger());
Action<Animal>
传递给一个期望 Action<Tiger>
的函数,因为 Tiger
对象也可以安全地传递给 Action<Animal>
委托。