It seems that I have encountered a scenario where many aspects of C# 2.0+ come into play. I needed to handle conversion from an IDataReader.GetValue() result to a generic type, including Nullable<>. It took me a while to figure it out and with a little help from this snippet, I was quite please with the result. So, I decided to share.
1: private static T NullValue<T>( object testValue, T nullValue )
2: {
3: T returnValue;
4: if( testValue is DBNull )
5: {
6: returnValue = nullValue;
7: }
8: else if( typeof(T).GetGenericTypeDefinition().Equals( typeof(Nullable<>) ) )
9: {
10: returnValue = (T)Convert.ChangeType( testValue, Nullable.GetUnderlyingType( typeof(T) ) );
11: }
12: else
13: {
14: returnValue = (T)Convert.ChangeType( testValue, typeof(T) );
15: }
16: return returnValue;
17: }
It turns out that System.Decimal cannot be converted directly to Nullable<Int32>. However, it can be converted to Int32, which can be converted to Nullable<Int32>. I guess the transitive property doesn't apply to type conversion.