C 中的協變性與逆變性 Part One

2021-07-30 05:51:57 字數 617 閱讀 4239

這篇部落格很著名,應該有很多人翻譯過了..但是忍住想自己翻譯一下。

「協變性」和「逆變性」是什麼意思?

首先,我們需要理解對於任意兩個型別t和u,下面必有乙個陳述是正確的(下文會用到這4個陳述):

舉個例子,想一下由animal, mammal, reptile, giraffe, tiger, snake和turtle組成的型別結構。很明顯,mammal型別比giraffe要大,但是比animal要小,和mammal相等,但是mammal和repitle無關。

這和可變性又有什麼關係呢?假如你有乙個變數,變數是乙個儲存位址。c#中的儲存位址都有與之聯絡的型別。執行時,你可以在那個位址儲存乙個相等型別的例項,或者是更小的型別的例項。換句話說,mammal型別變數可以儲存giraffe例項,但是不能儲存turtle。

現在我們可以講講變化性。考慮乙個作用於多個型別的操作。假設這個操作作用於任意型別t和u的結果是t』和u』,如果t』和u』之間的關係與t和u之間的關係相同,那麼這操作就是「協變性的」。如果這個操作逆轉了結果的大小關係(陳述1和2),但是保持了相等性(陳述3)和無關性(陳述4),那麼就說這個操作是「逆變性的」。

這聽起來咬文嚼字,也許還不太清楚,下次我們看看c#3怎麼實現變化性。

oc 的 協變性與逆變性

協變性與逆變性是型別關係在範疇論的定義。是型別的繼承關係在高階型別中的定義?kindof只是在統一繼承體系下方便了型別轉化,提供了使用時語法上的便捷 但是對於型別轉換是否正確不做判定 kindderived derived self getinstance kindof kindbase getin...

C 的協變性和逆變性

協變性。ienumerable string strings newlist string 引數 型別派生程度較大的例項化物件 分配給引數型別派生程度較小的物件引用。分配相容性被保留。ienumerable object objects strings 逆變性。假定我們有這麼個方法 static v...

深入理解泛型(二) 協變性和逆變性

引言 在c 2.0中泛型並不支援可變性的 可變性指的就是協變性和逆變性 我們知道在物件導向的繼承中就具有可變性,當方法宣告返回型別為stream,我們可以在實現中返回乙個filestream的型別,此時就存在乙個隱式的轉化 從filestream型別 子類引用 stream型別 父類引用 並且引用型...