【问题标题】:Did not get compile error when comparing Enum with const int using Equals使用 Equals 将 Enum 与 const int 进行比较时未出现编译错误
【发布时间】:2017-01-22 21:38:42
【问题描述】:

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 时也遇到编译时错误。

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

【问题讨论】:

标签: c# enums compare constants


【解决方案1】:

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

为什么会这样?这个推理很有趣——如果猫和狗四肢走路,就可以比较它们。通过一些几乎相同的属性来比较两个完全不同的对象。

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

【讨论】:

    【解决方案2】:

    != 是一种语言约定,因此这是特定于 C# 的。调用这个操作符是early bound,也就是说,它会在编译时发生。

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

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


    Equals 用于引用类型

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


    Equals 用于值类型

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

    【讨论】:

    • 两个答案几乎相同,但这个更“针对我的基本水平”,所以我越过了这个。但是谢谢大家!
    猜你喜欢
    • 2012-10-14
    • 2018-09-11
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多