非泛型类型中的通用方法

时间:2009-05-27 16:16:47

标签: c# .net generics

当你有这样的方法时:

public static T DoSomething<T> ( params T [ ] input )

C#允许您在不指定T的情况下调用它,例如:

DoClass.DoSomething ( "1", "2", "3" );

编译器是否通过传递给它的东西来计算T?

这是一个很好的约定(在这种情况下省略T)?

4 个答案:

答案 0 :(得分:3)

是的,编译器可以在大多数情况下推断泛型类型参数。 (除非是你的类型是lambda表达式,如果我没记错的话。)

通常认为在推断出通用参数时省略通用参数是非常好的做法。事实上,我会说它增加了一定的可读性(指定它们通常是多余的)。

答案 1 :(得分:1)

是的,编译器通常会找出类型。它被称为“类型推断”。

是的,将T留在呼叫站点是最佳做法。您编写的代码越少,以后需要阅读和理解的代码就越少。

如果你有ReSharper,它会很好地向你展示你可以去除的地方,并且无法通过移除呼叫站点来逃脱。否则你可以尝试把它拿出来,如果代码编译,那么你就不需要了。

答案 2 :(得分:1)

是的,当编译器能够确定T应该是什么时,指定它是多余的。我发现这是一个很棒的功能,因为当列出类型名称时(特别是长名称),它会变得乏味且难以阅读。

答案 3 :(得分:1)

正如许多人所提到的,这是由编译器的泛型参数类型推断引起的。它直接通过第一个参数发现类型。

另一件事 - 如果您阅读.net库的设计指南,实际上建议您以可以推断类型的方式编写所有通用方法。根据设计指南书,不可推理的通用方法被认为更难理解,应尽可能避免使用。