Why can't I use System.ValueType as a generics constraint?
There are two differences between using
where T : struct
and
where T : ValueType
- the latter would allow
T
to beValueType
itself, which is a reference type. - the latter would also allow
T
to be a nullable value type
The first of these differences is almost never what you want. The second could occasionally be useful; Nullable<T>
is slightly odd in that it satisfies neither the where T : struct
nor where T : class
constraint.
More useful would be the constraint
where T : struct, System.Enum
which is prohibited by C# for no good reason that I can tell. See my blog post and the Unconstrained Melody project for more on this.
ValueType is not the base class of value types, it is simply a container for the value when it is boxed. Since it is a container class and not in any sort of hierarchy for the actual types you're wanting to use, it is not useful as a generic constraint.
Using struct
as a generic constraint is functionally equivalent to a "ValueType" constraint. In .NET, a struct is a value type.