【发布时间】:2011-07-17 09:56:29
【问题描述】:
今天看到这个签名:
public interface ISomeInterface<in T>
in 参数有什么影响?
【问题讨论】:
-
这不是通用约束。
out和in用于将泛型参数标记为 co-/contra-variant。 -
我认为这意味着当一个类实现该接口时,例如
class A<T> : ISomeInterface和另一个类的子类 B。然后查看 LHS(左侧)上的接口,即静态类型侧和 RHS,除了通常同时制作 Ts 之外,您还可以可以使 T 与众不同,因为您可以使动态 T 成为超类。所以你可以说ISomeInterface<B> SomeIntWithB = new MyClass<A>();我自己还没有尝试过,这是我从 Schildt C# Ch18 中收集到的。 p558,559 -
他还提到了与代表的协变和逆变,没有泛型。正如人们所提到的,“in”是逆变。与泛型一起使用的“out”是协方差。在某种意义上,“out”一词也与 out vs ref 意义上的泛型无关。但是 in vs out 与泛型有关。协变和逆变也可以在没有泛型的情况下发生,在 Schildt c# 4.0 ch15 中提到的没有泛型的委托的情况下,但仍然适用于当前的 c#。