Vincoli Generic



In C# esistono 5 vincoli da poter utilizzare quando si crea un metodo generico.

Ma intanto vediamo a cosa possono servire, facciamo un esempio:

class TestClass<t>
{
public static T GetMaxValue(params T[] values)
{
T max = values[0];
for (int j = 1; j < values.Length; j++)
{
if (values[j] > max)
{
max = values[j];
}
}
return max;
}
}

Questo codice è apparentemente perfetto ed il metodo GetMaxValue trova il numero più grande data una lista che gli viene passata come parametro.

Quando andremo a compilare, però, ci verrà segnalato il seguente errore:

Operator ‘>’ cannot be applied to operands of type ‘T’ and ‘T’

Questo perché, essendo T un valore generico, quindi sia magari può essere int o double, ma può anche essere ad esempio di tipo string.

Per cose come queste si ricorre ai vincoli generic, questi sono in totale 5:

struct e class

Indicano che il tipo generico deve essere una variabile value (struct) o reference (class).

vincolo di interfaccia e vincolo di classe

Indicano che il tipo generico deve estendere una data interfaccia o una data classe.

vincolo new()

Indica che il tipo passato come generic ha un costruttore pubblico senza parametri.

Vediamo un esempio dell’uso del vincolo di interfaccia:

class TestClass where T : IComparable
{
public static T GetMaxValue(params T[] values)
{
T max = values[0];
for (int j = 1; j < values.Length; j++)
{
if (values[j].CompareTo(max) > 0)
{
max = values[j];
}
}
return max;
}
}

Come possiamo vedere aggiungendo il vincolo al tipo generico T di estensione di IComparable ora abbiamo a disposizione il metodo CompareTo, che possiamo usare per sostituire il maggiore (>) che usavamo prima e quindi far compilare correttamente il programma.

Annunci sponsorizzati:
Condividi su Facebook Condividi su Twitter!
Pinterest