当你有这样的方法时:
public static T DoSomething<T> ( params T [ ] input )
C#允许您在不指定T的情况下调用它,例如:
DoClass.DoSomething ( "1", "2", "3" );
编译器是否通过传递给它的东西来计算T?
这是一个很好的约定(在这种情况下省略T)?
答案 0 :(得分:3)
是的,编译器可以在大多数情况下推断泛型类型参数。 (除非是你的类型是lambda表达式,如果我没记错的话。)
通常认为在推断出通用参数时省略通用参数是非常好的做法。事实上,我会说它增加了一定的可读性(指定它们通常是多余的)。
答案 1 :(得分:1)
是的,编译器通常会找出类型。它被称为“类型推断”。
是的,将T留在呼叫站点是最佳做法。您编写的代码越少,以后需要阅读和理解的代码就越少。
如果你有ReSharper,它会很好地向你展示你可以去除的地方,并且无法通过移除呼叫站点来逃脱。否则你可以尝试把它拿出来,如果代码编译,那么你就不需要了。
答案 2 :(得分:1)
是的,当编译器能够确定T应该是什么时,指定它是多余的。我发现这是一个很棒的功能,因为当列出类型名称时(特别是长名称),它会变得乏味且难以阅读。
答案 3 :(得分:1)
正如许多人所提到的,这是由编译器的泛型参数类型推断引起的。它直接通过第一个参数发现类型。
另一件事 - 如果您阅读.net库的设计指南,实际上建议您以可以推断类型的方式编写所有通用方法。根据设计指南书,不可推理的通用方法被认为更难理解,应尽可能避免使用。