In the MSDN documentation on Generic Constraints:
Reference/Value Type Constraint
You can constrain a generic type parameter to be a value type (such as an int, a bool, and enum) or any custom structure using the struct constraint: public class MyClass<T> where T : struct
{...}
Similarly, you can constrain a generic type parameter to be a reference type (a class) using the class constraint: public class MyClass<T> where T : class
{...}
curiously, there is an example of everything but the use of an enum as a constraint.. C# compiler flags "enum" as expecting a type.