使用可空文字的真正时髦的C#编译器行为

时间:2010-09-20 21:46:18

标签: c# compiler-construction null nullable literals

C#4.0编译器没有抱怨这个(甚至没有警告):

if(10.0 > null + 1)
{       
}

if (myDoubleValue > null)
{
}

似乎总是错误的。这里发生了什么?是否会自动转换为Nullable<double>或其他内容?

如果是这样,为什么这不起作用呢?

double myDoubleValue = null + 1;

另外,为什么我会想要这样的行为。为什么有可能玩这样的文字是一件好事。

2 个答案:

答案 0 :(得分:8)

分配不起作用的原因是结果类型为double?,而不是double。结果将始终为double?(aka Nullable<double>)类型的空值。

哦,前两个块都应让编译器抱怨,并发出如下警告:

  

Test.cs(7,19):警告CS0458:The   表达式的结果总是如此   'int'类型的'null'   test.cs中(12,13):   警告CS0464:与null相比较   输入'double?'总是产生'假'

管理编译没有错误与不抱怨相同:)

答案 1 :(得分:2)

if(10.0 > null + 1)
{

}

实际上相当于:

int? i = null + 1; // i.HasValue = false in this case
if(10.0 > i)
{

}

所以你实际上是在尝试将不可空类型与没有值的可空类型进行比较。

double myDoubleValue = null + 1;

无法编译,因为右侧的类型为int?而非double

这个问题也只是出于好奇而试图#%= ^编译器,或者你实际上在实际项目中写这样的东西?