where T : struct The type parameter <T> must have System.ValueType in its chain
of inheritance; in other words, <T> must be a structure.
where T : class The type parameter <T> must not have System.ValueType in its
chain of inheritance (e.g., <T> must be a reference type).
where T : new() The type parameter <T> must have a default constructor. This is
helpful if your generic type must create an instance of the type
parameter because you cannot assume you know the format of
custom constructors. Note that this constraint must be listed last
on a multiconstrained type.
where T : NameOfBaseClass The type parameter <T> must be derived from the class specified
by NameOfBaseClass.
where T : NameOfInterface The type parameter <T> must implement the interface specified
by NameOfInterface. You can separate multiple interfaces as a
comma-delimited list.