比较可空的 short 类型值时,编译器会先将它们转换为整数再与空值进行比较。例如,考虑以下简单的代码:
short? cTestA;
if (cTestA == null) { ... }
它由编译器转换为:
short? CS$0$0001 = cTestA;
int? CS$0$0002 = CS$0$0001.HasValue ? new int?(CS$0$0001.GetValueOrDefault()) : null;
if (!CS$0$0002.HasValue){ ... }
这在所有 .NET 版本中都会发生,包括 .NET 4。
我漏掉了什么?为什么要进行两次转换才能检查 HasValue 值?
后续操作
我希望编译器进行简单的 .HasValue 检查,if (cTestA.HasValue){}
。至少在我发现这个转换后,这是我在自己的代码中所做的。
为什么要为这样一个简单的测试添加所有这些额外的代码呢?