Given a particular System.Type, how can I tell whether it would support nulls? Sounds easy enough as we all know that Value Types can't be null (int, DateTime and all structs have default values) and Reference Types can be null (string, object and all classes). The System.Type class is also kind enough to provide an IsValueType property...
Assert.IsTrue(typeof(int).IsValueType); // ok :)
Assert.IsFalse(typeof(string).IsValueType); // also good :)
But then I ran into a small problem highlighted by one of my unit tests against an int? type (actually an instance of the generic type Nullable<T> known as a nullable type).
Assert.IsFalse(typeof(int?).IsValueType); // Fails!!
I had assumed that because nullable types can be null they're Value Types but closer inspection actually reveals that Nullable<T> is actually a struct. Try again:
public static void CanBeNull(Type type)
return !type.IsValueType ||
(type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>));
Assert.IsTrue(CanBeNull(typeof(string))); // :)
Assert.IsFalse(CanBeNull(typeof(int))); // :)
Assert.IsTrue(CanBeNull(typeof(int?))); // :D
Anything I've missed?
PS - I wasn't actually using unit tests to test System.Type's IsValueType as I do in the top two code snippets, but I think it's a nice way of making a point.
03 Nov 2006
» Next Post:
The difference between Equals equals
« Previous Post:
Comments are closed for this post.