Compararea cu null
Ajungem in situatia cand, de exemplu, in interiorul unei metode generice trebuie sa comparam o variabila de tip generic cu null sau cu alte variabile de tip generic.
public static void GenericMethod<T>(T obj)
{
if(obj == null)
{
//cod doar pentru tipurile referinta
}
}
Pentru ca nu exista nici o constrangere asupra tipului generic, codul din interioul if-ului se va executa doar pentru tipurile referinta, pentru tipurile valoare nefiind posibil, chiar daca nu va fi generata nici o eroare la compilare in acest caz. Totusi, in cazul in care am adauga o constrangere la tipurile valoare, compilatorul isi va da seama ca respectiva conditie din if nu va fi executata niciodata.
public static void GenericMethod<T>(T obj) where T:struct
{
//expression is always false
if(obj == null)
{
//
}
}
Compararea cu alte variabile de tip generic
Compararea a doua variabile de tipul generic T nu este posibila decat daca exista o constrangere la tipul referinta.
Codul se va compila iar comparatia va returna true daca obiectele indica aceeasi referinta (articolul Egalitate in C#).
static void GenericMethod<T>(T obj1, T obj2) where T:class
{
//fara eroare la compilare
if(obj1 == obj2)
{
}
}
Pentru constrangerea la tipul valoare, compilatorul va emite o eroare la compilare. Spre deosebire de tipul valorilor primitive, int, byte cand compilatorul stie sa compare, pentru celelalte tipuri valoare compilatorul va emite eroare: Operator ‘==’ cannot be applied to operands of type ‘T’ and ‘T’.
static void GenericMethod<T>(T obj1, T obj2)
{
//eroare la compilare
if(obj1 == obj2)
{
}
}
Pentru tipul valoare operatorul == trebuie suprascris.