是优化可为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());
}

是优化可为null类型的C#编译器

您的测试失败是因为:

当类型隐式转换为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类型吗?

相关文章: