在C#4.0新特性介紹中,總是免不了對協變和逆變的介紹。但似乎協變逆變又很雞肋。我試圖簡單地講下協變(Covariance)和逆變(Contravariance)。
1,Co&Contravariance並非C#4.0引入的,早在C#1.0中就有了。只是C#4.0加入了對Generic Type的Co&Contravariance的支援。
2,Co&Contravariance是靜態語言用來支援(安全的隱式)類型轉換的技術。
3,Co&Contravariance都滿足Liskov原則:子類可以替換基類(在需要較少資訊的基類時候,可以提供較多資訊的子類來替代)。
4,只支援參考型別,實值型別則不支援。
Covariance
對Caller來說,需要返回一個基類。對Callee來說,實際返回了一個子類。看如下程式碼片段:
class Base{}class Sub:Base{};static Base SomeMethod(){ return new Sub(); //Sub casting up to Base.}
Caller: Access Sub via Base
Callee: Return Sub for Base
從Callee的視角來看:子類安全地向上Casting——提供了更多資訊.
Contravariance
對Callee來說,需要傳入一個基類。對Caller來說實際傳入一個子類。代碼如下:
class Base{}class Sub:Base{};static void SomeMethod(Base b){ Sub sb = (Sub)b; //Base casting down to Sub}static void Main(string[] args){ SomeMethod(new Sub());}
Callee:Access Sub via Base
Caller:Pass Sub for Base
從Callee的角度來看:基類向下Casting——可以提供更多資訊.
Reference
http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)
http://www.cnblogs.com/fox23/archive/2009/12/03/covariance-contravariance-in-csharp-4.html
http://www.cnblogs.com/Ninputer/archive/2008/11/22/generic_covariant.html