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

时间:2018-04-26 08:18:52

标签: c#

根据微软的documentation,我可以将值类型与null进行比较,将它们标记为可为空。在嵌套对象中使用零传播时,这尤其有用。

然而,当比较我认为是值类型的特定枚举时,我仍然可以与null进行比较,如下所示:

public class NullColorComparer
{

    public bool CompareNullWithColor()
    {
        // This return false.
        return null == Color.Red;
    }
}

public enum Color
{
    Red,
    Blue
}

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

5 个答案:

答案 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;

...