With where keyword you can apply restrictions to the kinds of types that client code can use for type arguments when it instantiates the generics class.
Example
public class A
{
}
public class B:A
{
}
public class GenericList <T> where T : A
{
}
GenericList<A> lst1 = new GenericList<A>(); // OK
GenericList<B> lst2 = new GenericList<B>(); // OK B derives from A
GenericList<int> lst3 = new GenericList<int>(); //Error 1 The type 'int' cannot be used as type parameter 'T' in the generic type or method 'WindowsFormsApplication1.GenericList'. There is no boxing conversion from 'int' to 'WindowsFormsApplication1.A'.