tags:

views:

256

answers:

3
  • Why can't I use a constraint of where T : System.ValueType?
  • Why does Microsoft not allow this type from being a constraint?


Example:

Why can't I do the following?

// Defined in a .Net class
public void bar<T>(T a) where T : ValueType {...}

// Defined in my class
public void foo<T>(T a) where T : ValueType 
{ bar<T>(a); }

What is the difference in using struct over ValueType?

// Defined in my class
public void foo<T>(T a) where T : struct 
{ bar<T>(a); }
+4  A: 

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.

Rex M
+2  A: 

Using struct as a generic constraint is functionally equivalent to a "ValueType" constraint. In .NET, a struct is a value type.

bobbymcr
+4  A: 

There are two differences between using

where T : struct

and

where T : ValueType
  • the latter would allow T to be ValueType 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.

Jon Skeet
Thanks for the thorough answer
Arriu