
n. 抗變性;逆變性
The distinction between covariance and contravariance is important for computations with tensors, which often have mixed variance.
協變和逆變的區别對于張量的計算尤為重要,這往往會出現混合方差。
In the meantime, I further elucidated the compatibility, incompatibility and contravariance of the mathematical concept.
同時,還進一步闡明了數學概念的兼容性、非兼容性和反變性。
Note that although the above examples show how to declare covariance and contravariance for delegate types, it's not different to do so with interfaces.
注意盡管上面的例子隻展示了對于代理類型如何聲明協變和逆變。對于接口這樣做也是不難的。
Contravariance(逆變)是計算機科學中類型系統的核心概念,用于描述複雜類型的子類型關系與其組件類型的子類型關系之間的反向關聯。具體而言,若類型構造器$F(T)$滿足:當$A$是$B$的子類型($A subseteq B$)時,$F(B)$是$F(A)$的子類型($F(B) subseteq F(A)$),則稱$F(T)$在$T$上具有逆變性質。
在函數類型中,逆變通常出現在參數位置。例如,若函數類型$Func(B→C)$是$Func(A→C)$的子類型,則要求參數類型$B$必須是$A$的父類型(即參數類型方向與子類型關系相反)。這種特性在C#委托和Java函數式接口中均有體現。
逆變的數學形式可表示為: $$ B subseteq A Rightarrow F(A) subseteq F(B) $$ 這一規則在範疇論和類型論中被嚴格定義,常見于函數參數類型的子類型推導。
IComparer<in T>
接口通過in
關鍵字聲明逆變,允許将IComparer<Animal>
賦值給IComparer<Dog>
類型的變量。-T
,則表示該位置支持逆變,增強類型系統的靈活性。Contravariance(逆變)是計算機科學中類型系統的核心概念,尤其在面向對象編程和泛型中廣泛應用。以下是詳細解釋:
Contravariance 描述了一種類型關系的逆轉規則:當類型參數在繼承關系中呈現與原始類型相反的方向時,仍能保持類型安全。
具體來說,如果類型 S
是 T
的子類型,則參數類型為 T
的函數/泛型可視為參數類型為 S
的父類型(即類型關系逆轉)。
Dog
是 Animal
的子類,協變允許方法返回 Dog
替代 Animal
。Animal
的函數可接受 Dog
類型的參數,則稱為逆變。in
關鍵字标記逆變的泛型參數(如 Action<in T>
),允許父類型泛型實例替代子類型。用類型關系公式可表示為:
$$
text{若 } S <: T implies F(T) <: F(S)
$$
其中,F
是泛型或函數類型,<:
表示子類型關系。
假設有接口 IComparer<in T>
:
IComparer<Animal> animalComparer = ...;
IComparer<Dog> dogComparer = animalComparer;// 合法,因為 T 是逆變的
此處,Animal
是 Dog
的父類,但 IComparer<Animal>
可賦值給 IComparer<Dog>
,體現了逆變特性。
Contravariance 通過逆轉類型關系,擴展了類型系統的靈活性,尤其在函數參數和泛型中實現安全的類型替代。理解協變與逆變的區别是掌握現代編程語言類型系統的關鍵。
【别人正在浏覽】