CSharp-变体
Show you the code.[1][2][3][4]
1 | // Variant type parameters could be declared in interfaces or delegates only! |
Microsoft Learn, Covariance and Contravariance in Generics 与 C# language specification §19.2.3 Variant type parameter lists 支撑:C# 的变体类型参数只出现在接口和委托类型上,并通过
in/out标注协变、逆变或不变。 ↩︎Microsoft Learn
outgeneric modifier 说明out表示协变类型参数,允许把更派生的类型实参作为更宽泛的泛型接口或委托使用;这对应示例里ICovariant<string>可赋值给ICovariant<object>。 ↩︎Microsoft Learn
ingeneric modifier 说明in表示逆变类型参数,允许把更宽泛的类型实参作为更具体的泛型接口或委托使用;这对应示例里IContravariant<object>可赋值给IContravariant<string>。 ↩︎Microsoft Learn Creating Variant Generic Interfaces 与 C# language specification 的 variance conversion 规则共同支撑:未标注
in/out的类型参数是不变的,变体转换需要满足对应的协变、逆变或恒等转换条件。 ↩︎