首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在公共委托int Comparison<in T>中' in‘是什么意思?

在公共委托int Comparison<in T>中' in‘是什么意思?
EN

Stack Overflow用户
提问于 2012-05-18 03:46:49
回答 4查看 109关注 0票数 1

msdn文档(http://msdn.microsoft.com/en-us/library/tfakywbh.aspx)使用看起来像关键字'in‘的内容报告比较数据门的语法。

代码语言:javascript
复制
public delegate int Comparison<in T>(
    T x,
    T y
)

“in”有什么实际意义吗?还有其他可能出现在那里的关键字吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-18 03:50:14

in表示泛型参数是逆变量。这意味着,在本例中,您可以将Comparison<Base>分配给Comparison<Derived>

您可以这样做,因为Comparison<Derived>变量可以接受接受Base类型参数的方法。在调用Comparison<Derived>时,需要传递Derived变量,这些变量恰好是接受Base参数的方法的有效参数。这意味着将Comparison<Base>分配给Comparison<Derived>是有意义的。

in的对立面(自然地)是out。这意味着该参数是协变的,并且可以将Derived泛型分配给Base泛型。例如,这将用于指定委托的返回类型。

一个方便的记住哪个是哪个的方法:

in应仅用于仅传入的类型。out应仅用于仅传出的类型。

点击此处阅读更多信息:

in (Generic Modifier) (C# Reference)

Covariance and Contravariance (C# and Visual Basic)

票数 5
EN

Stack Overflow用户

发布于 2012-05-18 03:51:12

如果您熟悉docs,为什么不使用它们呢?

它将参数指定为contravariant

票数 2
EN

Stack Overflow用户

发布于 2012-05-18 06:05:15

此委托是逆变量,in关键字表示T仅用作输入类型。反差意味着定义了这个委托类型:

代码语言:javascript
复制
public delegate int Comparison<in T>(T x, T y); 

您将能够执行以下操作:

代码语言:javascript
复制
Comparison<Control> comp1 = (a, b) => (a.Width*a.Height - b.Width*b.Height);
Comparison<TextBox> comp2 = comp1;

如果没有in关键字,它会抱怨第二行,说它不能将一种类型转换成另一种类型。但是,因为我们知道T只用于输入,所以将处理Control的委托分配给期望提供(输入) TextBox的委托指针应该是合法的。毕竟,TextBox会适合Control

另一方面,存在协方差。它还依赖于适合其他类型的类型,但这一次是针对结果(在本例中是委托的结果)。

协方差和逆方差统称为方差,不仅适用于泛型委托,还适用于泛型类和接口。Variance也适用于非泛型委托和数组,但以一种隐式的方式,因此不需要特殊的关键字-它只是工作。

方差不是一个简单的主题,我不能将我的解释与Eric Lippert的series of blog articles相提并论。尽管它是2007年的,他在那里用将来时谈论了.NET4 C#,但它仍然是一本非常好的书。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10642518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档