根据Microsoft的文档,我可以将值类型与null进行比较,将它们标记为可为空.在嵌套对象中使用零传播时,这尤其有用.
但是,当比较我认为是值类型的特定枚举时,我仍然可以与null进行比较,如下所示:
public class NullColorComparer
{
public bool CompareNullWithColor()
{
// This return false.
return null == Color.Red;
}
}
public enum Color
{
Red,
Blue
}
Run Code Online (Sandbox Code Playgroud)
为什么这样做?不应该编译因类型错误而失败?
枚举在比较之前被转换为它的可空版本,因此它可以并且将进行评估.但结果总是一样的.
这就是编译器警告你的原因:
警告CS0472表达式的结果始终为"false",因为"Color"类型的值永远不会等于"Color"类型的"null".
虽然比较没用,但编译器不会阻止您执行它.就像它不会阻止你做一个if(false) { },这是无用的.