隐式类型推断(方法)

将形式参数传递给泛型方法时,通常可以隐式推断相关的泛型类型参数。如果可以推断出所有泛型类型,则在语法中指定它们是可选的。

请考虑以下通用方法。它有一个形式参数和一个泛型类型参数。它们之间存在非常明显的关系 - 作为泛型类型参数的参数传递的类型必须与传递给形式参数的参数的编译时类型相同。

void M<T>(T obj)
{
}

这两个调用是等价的:

M<object>(new object());
M(new object());

这两个调用也是等效的:

M<string>("");
M("");

这三个调用也是如此:

M<object>("");
M((object) "");
M("" as object);

请注意,如果无法推断出至少一个类型参数,则必须指定所有这些参数。

请考虑以下通用方法。第一个泛型类型参数与形式参数的类型相同。但是第二个泛型类型参数没有这种关系。因此,编译器无法在对此方法的任何调用中推断第二个泛型类型参数。

void X<T1, T2>(T1 obj)
{
}

这不再起作用了:

X("");

这也不起作用,因为编译器不确定我们是否指定了第一个或第二个泛型参数(两者都有效为 object):

X<object>("");

我们需要输入它们,如下所示:

X<string, object>("");