');

C# Language Inferenza implicita del tipo (metodi)

Esempio

Quando si passano argomenti formali a un metodo generico, argomenti di tipo generico rilevanti possono essere normalmente dedotti implicitamente. Se è possibile dedurre tutti i tipi generici, specificarli nella sintassi è facoltativo.

Si consideri il seguente metodo generico. Ha un parametro formale e un parametro di tipo generico. Esiste una relazione molto evidente tra di essi: il tipo passato come argomento al parametro di tipo generico deve essere uguale al tipo di tempo di compilazione dell'argomento passato al parametro formale.

void M<T>(T obj)
{
}

Queste due chiamate sono equivalenti:

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

Queste due chiamate sono anche equivalenti:

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

E così sono queste tre chiamate:

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

Si noti che se non è possibile dedurre almeno un argomento di tipo, è necessario specificarli tutti.

Si consideri il seguente metodo generico. Il primo argomento di tipo generico è lo stesso del tipo dell'argomento formale. Ma non esiste una tale relazione per il secondo argomento di tipo generico. Pertanto, il compilatore non ha modo di inferire il secondo argomento di tipo generico in qualsiasi chiamata a questo metodo.

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

Questo non funziona più:

X("");

Anche questo non funziona, perché il compilatore non è sicuro se stiamo specificando il primo o il secondo parametro generico (entrambi sarebbero validi come object ):

X<object>("");

Siamo tenuti a digitare entrambi, in questo modo:

X<string, object>("");