where T : System.ValueType
? 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); }
You can specify one or more constraints on the generic type using the where clause after the generic type name. The following example demonstrates a generic class with a constraint to reference types when instantiating the generic class.
Multiple interface constraints can be specified. The constraining interface can also be generic.
A generic type is declared by specifying a type parameter in an angle brackets after a type name, e.g. TypeName<T> where T is a type parameter.
There are two differences between using
where T : struct
and
where T : ValueType
T
to be ValueType
itself, which is a reference type.T
to be a nullable value typeThe 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With