Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#编译器正在优化可空类型吗?_C#_Nullable - Fatal编程技术网

C#编译器正在优化可空类型吗?

C#编译器正在优化可空类型吗?,c#,nullable,C#,Nullable,有人能解释一下为什么这个单元测试在VisualStudio2013中失败了吗 [TestMethod] public void Inconceivable() { int? x = 0; Assert.AreEqual(typeof(int?), x.GetType()); } 您的测试失败,因为: 对可为null的类型调用GetType会导致在该类型隐式转换为时执行装箱操作。因此,GetType总是返回一个表示底层类型的Type对象,而不是可为空的类型 你可以从中读到更多 上

有人能解释一下为什么这个单元测试在VisualStudio2013中失败了吗

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

您的测试失败,因为:

对可为null的类型调用GetType会导致在该类型隐式转换为时执行装箱操作。因此,GetType总是返回一个表示底层类型的Type对象,而不是可为空的类型

你可以从中读到更多

上一篇文章中的一些例子:

int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"
还请注意:

C#运算符还对Nullable的底层类型进行操作。因此,不能使用is来确定变量是否为可空类型。下面的示例显示is运算符将可为空的变量视为int


你认为C#编译器正在优化可空类型是正确的。以下是Jon Skeet的一段话,可以回答您的问题:

只有在装箱和拆箱方面,CLR才具有 关于可空类型的任何特殊行为。事实上,在.NET2.0发布前不久,由于社区请求,该行为才发生了改变

Nullable的实例被装箱到null引用(如果它没有值)或装箱值t(如果有)。它从不将框转换为“装箱的可为null的int”-没有这种类型



StackOverflow上有一个类似的线程:

Assert.IsInstanceOfType(x,typeof(int?);为什么要断言由编译器静态确定的内容
x
不能是除
int?
之外的任何东西,否则程序将无法编译。@Servy-我的观点是单元测试在不应该的时候失败了。迪斯科苏丹出色地解释了原因。我让哲学家们来讨论GetType是否应该这样做。@Servy:来提出这个问题。@Dougcrack这就是我的观点。如果测试失败是因为测试编写不正确,而不是因为被测试的代码实际上是错误的,那么测试所造成的伤害大于好处。当测试不可能指出不工作的代码时,它不可能产生任何好的结果。你只是在浪费时间写这样的测试。
int? i = 5;
if (i is int) { ... } // true