Possible Duplicate:
Nullable type as a generic parameter possible?
I came across a very weird thing with generic type constraints. I have a class like this:
public SomeClass<T> where T:class
{
}
However, I've found I can't use nullable types as I'd expect:
new SomeClass<int?>();
I get an error that int?
must be a reference type. Is Nullable really just a struct with syntactic sugar to make it look like a reference type?
Value type constraint If we declare the generic class using the following code then we will get a compile-time error if we try to substitute a reference type for the type parameter.
Interface Type Constraint You can constrain the generic type by interface, thereby allowing only classes that implement that interface or classes that inherit from classes that implement the interface as the type parameter.
The type parameter is a placeholder for a specific type that the client specifies when they create an instance of the generic type. A generic class cannot be used as-is because it is simply a blueprint for that type.
Nullable<T>
is a struct
(see MSDN) however it is the only struct
that does not satisfy the struct
constraint. Therefore, you cannot use a Nullable
as a generic type parameter when either the class
or struct
constraints is used.
Nullable<T>
is not just a struct with some syntatic sugar. It has special support in the CLR for some of its behavior. For example, it has special boxing behavior. Specifically, a nullable is never boxed. The underlying value is boxed. If the nullable is the null value (HasValue is false) then it is converted to a null reference. Also, conversion operators for any Nullable<T>
to Nullable<U>
are lifted from the conversions from T
to U
. These are features you wouldn't be able to implement yourself in .NET 1.0/1.1.
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