C# 什么是;“出去”;在泛型类型参数之前是什么意思?
在查找C# 什么是;“出去”;在泛型类型参数之前是什么意思?,c#,.net,generics,compiler-construction,c#-3.0,C#,.net,Generics,Compiler Construction,C# 3.0,在查找GroupBy返回类型时,我刚刚看到了一个不熟悉的语法: public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement> 公共接口i分组:IEnumerable 我知道out在方法中意味着什么,但在泛型接口中却不知道 在泛型类型中,out是什么意思?它是C#4.0(Visual Studio 2010)中引入的两个泛型修饰符之一 它表示声明它的泛型参数是协变的 中的修饰符表示
GroupBy
返回类型时,我刚刚看到了一个不熟悉的语法:
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>
公共接口i分组:IEnumerable
我知道out
在方法中意味着什么,但在泛型接口中却不知道
在泛型类型中,
out
是什么意思?它是C#4.0(Visual Studio 2010)中引入的两个泛型修饰符之一
它表示声明它的泛型参数是协变的
中的修饰符表示它所声明的泛型参数是逆变的
请参见MSDN上的和。out
关键字在此上下文中表示对应的类型参数是协变的,简单地说,协变使您能够使用比泛型参数指定的类型更派生的类型
顺便说一句,请参阅Eric Lippert的这一由十部分组成的系列文章,以了解有关协方差和反方差的更多信息:out仅表示该类型仅用于输出,例如
public interface Foo<out T>
{
T Bar()
}
公共接口Foo
{
T Bar()
}
中还有一个修饰符,表示该类型仅用于输入,例如
public interface Foo<in T>
{
int Bar(T x)
}
公共接口Foo
{
整型条(T x)
}
之所以使用这些参数,是因为带有in的接口在T中是协变的,而带有out的接口在T中是逆变的。它表示一个参数。另请参见上的说明。本质上说,i分组
可以被视为i分组
,因此您可以
IGrouping<Aderived, Bderived> gr = MakeGrouping(...);
IGrouping<Abase, Bbase> grBase = gr;
IGrouping gr=MakeGrouping(…);
i分组grBase=gr;
如果Aderived
是从Abase
派生的接口或类型。当您想要调用一个需要类型为IGrouping
的参数的方法,但只得到类型为IGrouping
的对象时,这是一个方便的特性。在这种情况下,由于两种类型的类型参数的协方差性,可以认为这两种类型是等效的。这是一个通用修饰符。查看MSDN,12k代表在询问之前至少不能看一眼?@Reniuz。我发现只有out
reference。抱歉…我只是在谷歌上搜索了一下出了generic
,发现:)我想你在第二个例子中指的是公共界面Foo
(而不是出了
),对吗?@ralzarek你倒过来了:出是协变的,入是反变的我知道这些术语,但在我看来,MSDN示例对泛型的in
和out
修饰符的描述并不十分清楚。你能给出一些更容易理解的例子吗?这只是从MSDN复制/粘贴。弗兰克的回答应该被接受,而不是这个。@SergeyAkopov-你当然有权发表自己的意见,但接受与否完全取决于提问者的决定。