Presupunem ca avem urmatoarea metoda generica in care declaram si initializam o variabila de tip T. Apoi, apelam metoda ToString.
static void GenericMethod<T>(T obj) { T item = obj; Console.WriteLine(item.ToString()); }
Acest cod functioneaza pentru toate tipurile de date din .Net. Chiar daca T este tip valoare sau tip referinta, in ambele cazuri variabila suporta atribuirea unei valori si apelul metodei ToString (metoda definita de Object).
Urmatoarea metoda generica va genera eroare la compilare: ‘T’ does not contain a definition for ‘CompareTo’ and no extension method ‘CompareTo’ accepting a first argument of type ‘T’ could be found (are you missing a using directive or an assembly reference?). Motivul este simplu, nu toate tipurile ofera metoda CompareTo.
static T AnotherGenericMethod<T>(T obj1, T obj2) { if (obj1.CompareTo(obj2) < 0) return obj1; return obj2; }
Pentru a scapa de aceasta eroare se foloseste un mecanism pe care CLR il numeste constrangere, adica un mod de a limita tipuri care pot fi specificate tipului generic. Implementarea este realizata cu ajutorul lui where, iar compilatorul va sti ca toate tipurile specificate pentru T trebuie sa implementeze interfata IComparable.
static T AnotherGenericMethod<T>(T obj1, T obj2) where T : IComparable { if (obj1.CompareTo(obj2) < 0) return obj1; return obj2; }