隱式型別推斷(方法)

將形式引數傳遞給泛型方法時,通常可以隱式推斷相關的泛型型別引數。如果可以推斷出所有泛型型別,則在語法中指定它們是可選的。

請考慮以下通用方法。它有一個形式引數和一個泛型型別引數。它們之間存在非常明顯的關係 - 作為泛型型別引數的引數傳遞的型別必須與傳遞給形式引數的引數的編譯時型別相同。

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>("");