[英]Is the C# compiler optimizing nullable types?
任何人都可以了解为什么这个单元测试在Visual Studio 2013中失败了?
[TestMethod]
public void Inconceivable()
{
int? x = 0;
Assert.AreEqual(typeof(int?), x.GetType());
}
您的测试失败,因为:
在Nullable类型上调用GetType会导致在将类型隐式转换为Object时执行装箱操作。 因此, GetType始终返回表示基础类型的Type对象,而不是Nullable类型。
您可以从如何:识别可空类型中了解更多信息 。
从前一篇文章中摘取的一些例子:
int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"
另请注意:
C#的是操作者也可为空的基本类型进行操作。 因此,您无法使用is来确定变量是否为Nullable类型。 以下示例显示is运算符将Nullable <int>变量视为int。
int? i = 5;
if (i is int) { ... } // true
假设C#编译器正在优化可空类型,你是正确的。 以下是Jon Skeet的深度C#的引用,它应该回答你的问题:
只有在装箱和拆箱方面,CLR才有关于可空类型的任何特殊行为。 实际上,这种行为只是在.NET 2.0发布之前不久发生了变化,这是社区请求的结果。
Nullable的实例被装箱为空引用(如果它没有值)或盒装值T(如果有)。 它永远不会装入“盒装可空的int” - 没有这种类型。
StackOverflow上有一个类似的线程: Nullable类型不是可以为空的类型?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.