Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是;“出去”;在泛型类型参数之前是什么意思?_C#_.net_Generics_Compiler Construction_C# 3.0 - Fatal编程技术网

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-你当然有权发表自己的意见,但接受与否完全取决于提问者的决定。