2012-04-05 67 views
19

我刚刚看到一个不熟悉的语法,同时寻找GroupBy返回类型:在一个泛型接口在“泛型”类型参数之前,“out”是什么意思?

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement> 

MSDN Source

我知道这是什么意思out的方法,但不是。

out在泛型中的含义是什么?

+1

这是一个*通用修饰符*。请参阅MSDN http://msdn.microsoft.com/en-us/library/dd469487.aspx – 2012-04-05 11:24:20

+3

与12k代表至少看[MSDN](http://msdn.microsoft.com/en-us/library/ dd469487.aspx)之前问? – Reniuz 2012-04-05 11:24:54

+0

@Reniuz。我发现那里只有'out'参考。对不起...... – gdoron 2012-04-05 11:25:52

回答

9

它是C#4.0(Visual Studio 2010)中引入的两个通用修饰符之一。

它表示它声明的泛型参数是协变的。

in修饰符表示其声明的通用参数是逆变。

请参阅MSDN上的out (Generic Modifier)in (Generic Modifier)

+0

我知道术语[反向和协方差](http://msdn.microsoft.com/en-us/library/ee207183.aspx),但在我看来,MSDN的例子并没有描述泛型的'in'和'out'修饰符。你能举出一些比较容易理解的例子吗? – Matt 2012-12-14 09:47:24

+1

这只不过是从MSDN复制/粘贴而已。弗兰克的答案应该被接受,而不是这个。 – 2013-02-21 20:06:33

+0

@SergeyAkopov - 你当然有资格接受你的意见,但接受与否完全是问题提供者决定的事情。 – Oded 2013-02-21 20:07:46

5

出只是意味着该类型仅用于输出例如

public interface Foo<out T> 
{ 
    T Bar() 
} 

这里还有一个修饰词,表示该类型仅用于输入,例如,

public interface Foo<in T> 
{ 
    int Bar(T x) 
} 

这些使用,因为在接口T中是协变,并与出接口是逆变在T.

+0

我假设你在第二个例子中的意思是'public interface Foo '(而不是'out'),对吗? – Matt 2012-12-14 09:43:28

+0

@Matt哎呀,你是对的。谢谢,现在修复。 – 2012-12-14 09:59:25

+0

@ralzarek你有它倒退:out是协变和in是逆变的 – BaltoStar 2017-07-17 18:14:30

14

它表示covariant参数。另见关于MSDN的描述。本质上,它说,该IGrouping<Aderived, Bderived>可视为IGrouping<Abase, Bbase>,因此你可以

IGrouping<Aderived, Bderived> gr = MakeGrouping(...); 
IGrouping<Abase, Bbase> grBase = gr; 

如果Aderived是一个接口或Abase派生的类型。当您想调用需要参数类型为IGrouping<Abase, Bbase>的方法时,此功能非常实用,但您只能获得IGrouping<Aderived, Bderived>类型的对象。在这种情况下,由于类型参数的协方差,两种类型都可以被认为是等价的。

相关问题