是优化可为null类型的C#编译器
本文关键字:编译器 类型 null 优化 | 更新日期: 2023-09-27 17:59:15
有人能解释为什么这个单元测试在Visual Studio 2013中失败吗?
[TestMethod]
public void Inconceivable()
{
int? x = 0;
Assert.AreEqual(typeof(int?), x.GetType());
}
您的测试失败是因为:
当类型隐式转换为Object时,对可为null的类型调用GetType会导致执行装箱操作。因此,GetType总是返回一个Type
您可以从"如何:识别可为null的类型"中了解更多信息。
上一篇文章中的一些例子:
int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"
还要注意:
C#is运算符还对Nullable的底层类型进行操作。因此,不能使用is来确定变量是否为Nullable类型。下面的示例显示is运算符处理Nullable<int>变量作为内部
int? i = 5;
if (i is int) { ... } // true
假设C#编译器正在优化可为null的类型是正确的。以下是Jon Skeet的《深度C#》中的一句话,它应该能回答你的问题:
CLR只有在装箱和取消装箱方面才具有关于可为null类型的任何特殊行为。事实上,在.NET 2.0发布前不久,由于社区请求,这种行为才发生了改变。
Nullable的实例被装箱为null引用(如果它没有值)或装箱的t值(如果它有值)。它从不装箱到"装箱的可为null的int"——没有这样的类型。
StackOverflow上有一个类似的线程:可为null的类型不是可为null类型吗?