C#编译器是否优化了可空类型?

Dou*_*ter 18 c# nullable

任何人都可以了解为什么这个单元测试在Visual Studio 2013中失败了?

[TestMethod]
public void Inconceivable()
{
    int? x = 0;
    Assert.AreEqual(typeof(int?), x.GetType());
}
Run Code Online (Sandbox Code Playgroud)

Jaa*_*rus 27

您的测试失败,因为:

在Nullable类型上调用GetType会导致在将类型隐式转换为Object时执行装箱操作.因此,GetType始终返回表示基础类型的Type对象,而不是Nullable类型.

您可以从如何:识别可空类型中了解更多信息.

从前一篇文章中摘取的一些例子:

int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"
Run Code Online (Sandbox Code Playgroud)

另请注意:

C#的操作者也可为空的基本类型进行操作.因此,您无法使用is来确定变量是否为Nullable类型.以下示例显示is运算符将Nullable <int>变量视为int.

int? i = 5;
if (i is int) { ... } // true   
Run Code Online (Sandbox Code Playgroud)

假设C#编译器正在优化可空类型,你是正确的.以下是Jon Skeet的深度C#的引用,它应该回答你的问题:

只有在装箱和拆箱方面,CLR才有关于可空类型的任何特殊行为.实际上,这种行为只是在.NET 2.0发布之前不久发生了变化,这是社区请求的结果.

Nullable的实例被装箱为空引用(如果它没有值)或盒装值T(如果有).它永远不会装入"盒装可空的int" - 没有这种类型.


StackOverflow上有一个类似的线程:Nullable类型不是可以为空的类型?