2009-11-12 69 views
17

我在Channel 9上觀看了一段關於它的視頻,但我並沒有真正理解它。瞭解C#4.0中的協變和反變化

有人可以給我一個關於這些容易理解的簡單例子嗎?那之後可能會如何在實踐中使用它?

+2

什麼是Channel 9? – 2009-11-12 19:55:27

+2

http://channel9.msdn.com/ - 有關微軟開發框架的視頻集合,以及更多:) – cwap 2009-11-12 19:56:59

+0

是啊,它就像一個播客,有一些非常好的安德斯等C#視頻等。 – 2009-11-12 19:58:48

回答

8

你可能想看看這個博客,他做了一個很棒的工作來解釋它,但我認爲它需要更多的例子來爲人們清理它,因爲這進入了一個非常難以理解的領域,但是,文章中的下面引用總結得很好。

http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html

「協變和逆變」是指 您現在可以通過不精確通用 類型時,它是安全的這樣做,就像 可以傳遞不準確的參數類型 當它是安全的這樣做。

3

埃裏克利珀一個很好的解釋在最近blog post

7

一個Tiger想出是Animal所以它可以做任何事情的Animal可以做。如果我有一個方法,要求Animal我也可以通過Tiger

協方差 - 傳遞一個更具體的類型參數

這是你最熟悉的方向。我可以在任何需要IEnumerable<Animal>的地方通過IEnumerable<Tiger>


static void ListAnimals(IEnumerable<Animal> animals) 
{ 
} 

List<Tiger> tigers = new List<Tiger>(); 
ListAnimals(tigers); 

逆變 - 傳遞一個更一般的類型參數。

「對比」意味着這與'正常轉換流'相反。這一個更棘手,因爲它看起來是反直覺的,直到你看到它在行動。

說我有一個功能,它需要IComparer<Tiger>和兩隻老虎進行比較。反變化說我也可以通過更通用的IComparer<Animal>,因爲它可以比較兩隻老虎(因爲老虎是一隻動物)。它以更一般的方式比較它們,但這仍然是類型安全的。


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>委託。