使用Equals比较Enum和const int时没有得到编译错误

时间:2017-01-22 21:38:42

标签: c# enums compare const

C#:代码部分:

class ConstValues
{
   public const int NULL=1;
}

class Example
{
   private enum FormatFunction
   {
      Date,
      Unknown
   }

   ...

   FormatFunction returnValue = fn();

   ...

现在我有两个场景。

当我使用这种方式将我的返回代码与值

进行比较时
if (!returnValue.Equals(ConstValues.NULL))
{
   ...

我没有编译时错误(并且代码无法正常工作,因为这是我错过的一个错误)。

但是当我改为

if (returnValue != ConstValues.NULL)
{
   ...

我收到编译时错误并发现我犯的错误。

我知道枚举的底层结构是int,但即使使用Equals,我宁愿得到编译时错误。

为什么第一种方式通过而第二种方式没有?

2 个答案:

答案 0 :(得分:3)

这是因为默认的虚拟Equals方法正在接收对象而不是像第二个示例中那样的强类型值。它被装入对象并仅在运行时检查类型。

为什么这样做?推理非常有趣 - 如果他们四肢行走,可以比较猫和狗。通过一些几乎相同的属性比较两个完全不同的对象。

事情是,当你可以 - 使用强类型对象。这样可以防止在编译时发生不良事件。

答案 1 :(得分:2)

!=是一种语言约定,因此这是C#特有的。调用此运算符是早期绑定,换句话说,它将在编译时发生。

Equals是一种框架约定,在这种情况下是.NET,并且在运行时绑定。

当您调用!=时,编译期间C#编译器会做出决定,因此您会收到错误消息。当您调用Equals时,框架会在运行时做出决定。由于你的枚举不是类型对象,它将变成一个对象(装箱)然后运行时将检查你的类型是否覆盖了Equals方法,因为你没有,它将使用默认实现。

参考类型

Equals

如果实例是引用类型,则Equals的默认实现检查一个对象引用是否与另一个对象引用相同。如果它们是相同的引用,则返回true。否则返回false。

Equals

如果实例是值类型,那么它将测试值相等性。这是你的情况。它将检查您的枚举值是否等于常量值。不会显示或抛出错误:它等于或不等。