C#4.0编译器没有抱怨这个(甚至没有警告):
if(10.0 > null + 1)
{
}
if (myDoubleValue > null)
{
}
似乎总是错误的。这里发生了什么?是否会自动转换为Nullable<double>
或其他内容?
如果是这样,为什么这不起作用呢?
double myDoubleValue = null + 1;
另外,为什么我会想要这样的行为。为什么有可能玩这样的文字是一件好事。
答案 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
。
这个问题也只是出于好奇而试图#%= ^编译器,或者你实际上在实际项目中写这样的东西?