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.