Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un metodo generico è un metodo dichiarato con parametri di tipo, come indicato di seguito:
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
Nell'esempio di codice seguente viene illustrato un modo per chiamare il metodo usando int per l'argomento type:
public static void TestSwap()
{
int a = 1;
int b = 2;
Swap<int>(ref a, ref b);
System.Console.WriteLine(a + " " + b);
}
È anche possibile omettere l'argomento di tipo e il compilatore lo dedurrà. La chiamata seguente a Swap equivale alla chiamata precedente:
Swap(ref a, ref b);
Le stesse regole per l'inferenza del tipo si applicano ai metodi statici e ai metodi di istanza. Il compilatore può dedurre i parametri di tipo in base agli argomenti del metodo passati; non può dedurre i parametri di tipo solo da un vincolo o da un valore restituito. Di conseguenza, l'inferenza del tipo non funziona con metodi che non dispongono di parametri. L'inferenza dei tipi si verifica in fase di compilazione prima che il compilatore tenti di risolvere le firme di metodo sovraccaricate. Il compilatore applica la logica di inferenza del tipo a tutti i metodi generici che condividono lo stesso nome. Nel passaggio di risoluzione dell'overload il compilatore include solo i metodi generici su cui l'inferenza del tipo ha avuto esito positivo.
All'interno di una classe generica, i metodi non generici possono accedere ai parametri di tipo a livello di classe, come indicato di seguito:
class SampleClass<T>
{
void Swap(ref T lhs, ref T rhs) { }
}
Se si definisce un metodo generico che accetta gli stessi parametri di tipo della classe contenitore, il compilatore genera l'avviso CS0693 perché all'interno dell'ambito del metodo, l'argomento fornito per l'interno T nasconde l'argomento fornito per l'oggetto esterno T. Se è necessaria la flessibilità di chiamare un metodo di classe generica con argomenti di tipo diversi da quelli forniti quando è stata creata un'istanza della classe, è consigliabile fornire un altro identificatore per il parametro di tipo del metodo, come illustrato nell'esempio GenericList2<T> seguente.
class GenericList<T>
{
// CS0693.
void SampleMethod<T>() { }
}
class GenericList2<T>
{
// No warning.
void SampleMethod<U>() { }
}
Usare i vincoli per abilitare operazioni più specializzate sui parametri di tipo nei metodi. Questa versione di Swap<T>, ora denominata SwapIfGreater<T>, può essere usata solo con argomenti di tipo che implementano IComparable<T>.
void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
T temp;
if (lhs.CompareTo(rhs) > 0)
{
temp = lhs;
lhs = rhs;
rhs = temp;
}
}
È possibile sovraccaricare i metodi generici su vari parametri di tipo. Ad esempio, i metodi seguenti possono trovarsi nella stessa classe:
void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }
È anche possibile usare il parametro di tipo come tipo restituito di un metodo. Nell'esempio di codice seguente viene illustrato un metodo che restituisce una matrice di tipo T:
T[] Swap<T>(T a, T b)
{
return [b, a];
}
Specifiche del linguaggio C#
Per altre informazioni, vedere la specifica del linguaggio C#.