根据微软的documentation,我可以将值类型与null进行比较,将它们标记为可为空。在嵌套对象中使用零传播时,这尤其有用。
然而,当比较我认为是值类型的特定枚举时,我仍然可以与null进行比较,如下所示:
public class NullColorComparer
{
public bool CompareNullWithColor()
{
// This return false.
return null == Color.Red;
}
}
public enum Color
{
Red,
Blue
}
为什么这样做?不应该编译因类型错误而失败吗?
答案 0 :(得分:6)
枚举在比较之前被转换为它的可空版本,因此它可以并且将进行评估。但结果总是一样的。
这就是编译器警告你的原因:
警告CS0472表达式的结果总是“假”'因为类型的颜色'颜色'绝不等于' null'类型'颜色?'
虽然比较没用,但编译器不会阻止您执行它。就像它不会阻止你制作if(false) { }
一样,这也是无用的。
答案 1 :(得分:1)
比较的null
方面被视为Nullable<Program.Color>
并且会进行编译,因为您可以将Nullable<WhatEver>
与WhatEver
进行比较。
然而,它会发出警告:
警告CS0472表达式的结果总是“假”&#39;因为类型&#39; Program.Color&#39;的值绝不等于&#39; null&#39;类型&#39; Program.Color?&#39;
答案 2 :(得分:0)
C#编译器不会阻止比较。但是你得到一个警告:&#34;表达式的结果总是“假”&#39;因为类型&#39;颜色&#39;的价值绝不等于&#39; null&#39;类型&#39;颜色?&#39;&#34;。
它让你比较,但说它总是假的。对于任何值类型都是如此。您甚至可以将Int32
值与null进行比较,您将得到相同的结果。无需编译时错误&#39;
答案 3 :(得分:0)
即使值类型永远不会是null
,您仍然可以将值类型与null
进行比较,并且始终会生成false
。
像ReSharper这样的工具可以检测到这一点,并且实际上可能会警告你它是无用的比较。
答案 4 :(得分:0)
当然,根据您的代码,您总是会得到错误,因为您正在将枚举的静态实例与空值进行比较。
你的比较是有意义的,例如:
public enum TestEnum
{
Item1,
Item2
}
...
TestEnum? t = null;
return t== null;
...