【问题标题】:What does an "in" generic parameter do?“in”泛型参数有什么作用?
【发布时间】:2011-07-17 09:56:29
【问题描述】:

今天看到这个签名:

public interface ISomeInterface<in T>

in 参数有什么影响?

【问题讨论】:

  • 这不是通用约束。 outin 用于将泛型参数标记为 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#。

标签: c# generics


【解决方案1】:

您可以阅读 .NET 4.0 中引入的通用 variance and contravariancein 关键字对接口的影响是它声明它为逆变的意思是T 只能用作输入法类型。您不能将其用作此接口的方法的返回类型。这样做的好处是您将能够做这样的事情(如上述文章所示):

interface IProcessor<in T>  
{  
    void Process(IEnumerable<T> ts);  
}

List<Giraffe> giraffes = new List<Giraffe> { new Giraffe() };  
List<Whale> whales = new List<Whale> { new Whale() };  
IProcessor<IAnimal> animalProc = new Processor<IAnimal>();  
IProcessor<Giraffe> giraffeProcessor = animalProc;  
IProcessor<Whale> whaleProcessor = animalProc;  
giraffeProcessor.Process(giraffes);  
whaleProcessor.Process(whales);  

【讨论】:

  • 很好的例子,特别是因为您在逆变类型 IProcessor 中使用了协变类型 IEnumerable
【解决方案2】:

这表示泛型逆变。相反的是协方差(关键字out)。

这意味着当接口是逆变的(in)时,当类型参数继承 T 时,接口可以隐式转换为泛型类型。

相反,对于协方差out,接口可以隐式转换为泛型类型,其中类型参数是类型层次结构中的“较小”类型。

【讨论】:

  • 你写“继承T的类型参数”。这不是英语,请您纠正一下吗?
  • 完成了,更好吗?语法有时对我来说有点滑,因为我不是以英语为母语的人。
  • 是的,那行现在是英文的。在你说“‘低级’类型”的地方,我认为你的意思是“‘低级’类型”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多