Intellisense中LINQ方法中的尖括号是什么意思?(Contains<>, Count<>, Distinct<>等)

5
他们通常涉及到泛型。但是某些带有泛型的方法没有它们,而且并不是所有的扩展方法都有它们。
自从诞生以来,我们都见过它们;但我意识到我仍然不知道它们的意思,而且我找不到答案。现在这真的很困扰我。谷歌只会显示与 XML 相关的结果。
这是否在任何地方得到了正式记录?谢谢。
编辑:好吧,太棒了。因为我刚刚创建了一个帐户来发表我的第一篇 Stack Overflow 帖子,以获取这个燃烧的问题的答案; 我不能发布我的漂亮的 Intellisense 图片,或者创建一个新的标签 "angle-brackets"。我喜欢 Stack Overflow,但......欢迎吧!
也许我的问题是它们实际上并不叫“角括号”...?
无论如何,我想如果你真的想看到我的美丽截图,你可以手动转到:Distinct>< http://www.freeimagehosting.net/uploads/6a6c2f3268.png
请帮我顶一下,这样我就可以在文章中包含它了,谢谢。 ;)

ReSharper会隐藏它们...当您安装它时,您可以转到“选项-> IntelliSense->常规”,然后选择ReSharper自己的IntelliSense或VS的IntelliSense。 - tanascius
感谢大家的答案和投票。我知道泛型,但不确定尖括号(在Intellisense中)的具体指定。我猜我的困惑是看到像这样的两个版本:new int[] { 1, 2 }.Sum,一个(没有尖括号)用于泛型类上的扩展方法,另一个(带有尖括号)用于泛型类上的通用扩展方法!感谢解释和确认。 - Dan Puza
顺便问一下,有没有人有MSDN或其他链接将通用方法与Intellisense中的那个标记特别联系起来?不是我不相信你...只是奇怪我找不到任何东西 - Dan Puza
感谢James Westgate和SLaks修复标签并添加图片! - Dan Puza
5个回答

8

这些方法是通用的。

然而,编译器会自动从方法调用中推断出通用类型参数,所以在调用方法时不需要使用尖括号。

例如,如果您有一个 IEnumerable<int> myNumbers,下面四个语句是等价的:

myNumbers.Count();
myNumbers.Count<int>();
Enumerable.Count(myNumbers);
Enumerable.Count<int>(myNumbers);

在第一次和第三次调用中,编译器会推断出int参数,因为myNumbers是一个IEnumerable<int>类型。 Count扩展方法在System.Core.Dll中声明,如下所示:
public static int Count<TSource>(this IEnumerable<TSource> source);

2

它们是用于泛型的。当你使用这些函数时,通常情况下你不需要输入<T>,因为编译器可以通过上下文推断出类型。


1

它们是通用方法签名。我建议你学习一下。

关于泛型有几个有趣的事情需要注意:首先,在编译后它们不再是泛型。在运行应用程序之前,所有类型都已解析并确定。其次,编译器通常可以理解你的意思,因此你不必明确说明。例如,如果一个方法签名是DoSomething<T>(t withThis),你可以像这样调用这个方法:DoSomething<string>("with me")或者你可以省略泛型类型:DoSomething("with me")。这是因为编译器查看传递给方法作为参数的类型,并计算出方法的类型参数。太棒了。


好链接。这正是我在寻找的东西,谢谢你。 - Dan Puza

0

0

Jon Skeet的书C#深度剖析详细介绍了泛型和linq,为我解决了很多问题 - 我强烈推荐它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接