为什么我可以将枚举与null进行比较?

And*_*sen 3 c#

根据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)

为什么这样做?不应该编译因类型错误而失败?

Pat*_*man 6

枚举在比较之前被转换为它的可空版本,因此它可以并且将进行评估.但结果总是一样的.

这就是编译器警告你的原因:

警告CS0472表达式的结果始终为"false",因为"Color"类型的值永远不会等于"Color"类型的"null".

虽然比较没用,但编译器不会阻止您执行它.就像它不会阻止你做一个if(false) { },这是无用的.