回答
你可能想看看這個博客,他做了一個很棒的工作來解釋它,但我認爲它需要更多的例子來爲人們清理它,因爲這進入了一個非常難以理解的領域,但是,文章中的下面引用總結得很好。
http://hestia.typepad.com/flatlander/2008/12/c-covariance-and-contravariance-by-example.html
「協變和逆變」是指 您現在可以通過不精確通用 類型時,它是安全的這樣做,就像 可以傳遞不準確的參數類型 當它是安全的這樣做。
以下文章涉及與代表的共同作用和反作用:http://msdn.microsoft.com/en-us/library/ms173174.aspx。
即使您還沒有進入代表,它可能對您有用。我發現它很容易理解。
MSDN文檔的C#4.0(和VB)的位置:Covariance and Contravariance
如果你有興趣在具體的例子,他們在這裏:
埃裏克利珀一個很好的解釋在最近blog post
一個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>
委託。
- 1. .NET 4.0泛型不變,協變,反變
- 2. C#4.0中協變和反變換的真實用例的實例?
- 3. C#4.0中的協變和逆變推斷
- 4. .NET 4.0中的協變和反變換的一個很好的實際應用?
- 5. 協方差和反變量
- 6. 瞭解變化的含義
- 7. 在Java泛型的協變和反變量中的寫入
- 8. 不應該在C#4.5中使用協變/反變量嗎?
- 9. 協變和隱藏在C++
- 10. C變量無法解釋的變化
- 11. 在C中的ICollection協變#
- 12. IsAssignable從協方差和反變換
- 13. 通用協方差和反變量
- 14. 瞭解asp.net 4.0中的「using」語句 - C#
- 15. Glassfish 4.0中的DigestRealmBase發生了什麼變化?
- 16. 協變和IList
- 17. 瞭解java中的類和變量
- 18. 協議緩衝區序列化C + +和反序列化C#類
- 19. 瞭解$ _POST和$ _SESSION變量
- 20. .NET:協變和逆變
- 21. ValidateRequest停止變化.NET 4.0
- 22. Silverlight 4.0協變的替代方案4.0 IEnumerable <T>
- 23. .NET 4.0和C#4.0中的事件和委託反轉現象
- 24. 反應變量在jsx中變化
- 25. 如何初始化協變變量?
- 26. 瞭解靜態變量的聲明/初始化C
- 27. C#4.0中的新動態變量
- 28. 在C#4.0中,爲什麼方法中的out參數不能協變?
- 29. ProgressBar不反映價值變化C#
- 30. 瞭解局部變量初始化
什麼是Channel 9? – 2009-11-12 19:55:27
http://channel9.msdn.com/ - 有關微軟開發框架的視頻集合,以及更多:) – cwap 2009-11-12 19:56:59
是啊,它就像一個播客,有一些非常好的安德斯等C#視頻等。 – 2009-11-12 19:58:48