C# 使用Equals将枚举与常量int进行比较时未获得编译错误

C# 使用Equals将枚举与常量int进行比较时未获得编译错误,c#,enums,compare,constants,C#,Enums,Compare,Constants,C#:代码部分: class ConstValues { public const int NULL=1; } class Example { private enum FormatFunction { Date, Unknown } ... FormatFunction returnValue = fn(); ... 现在我有两种情况 当我使用这种方法将返回代码与值进行比较时 if (!returnValue.Equa

C#:代码部分:

class ConstValues
{
   public const int NULL=1;
}

class Example
{
   private enum FormatFunction
   {
      Date,
      Unknown
   }

   ...

   FormatFunction returnValue = fn();

   ...
现在我有两种情况

当我使用这种方法将返回代码与值进行比较时

if (!returnValue.Equals(ConstValues.NULL))
{
   ...
我没有得到编译时错误(代码没有按预期工作,因为这是我错过的一个bug)

但是当我换成

if (returnValue != ConstValues.NULL)
{
   ...
我得到了一个编译时错误,并发现了我所犯的错误

我知道枚举的底层结构是int,但我宁愿在使用Equals时也会出现编译时错误


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

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

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


问题是,当您可以使用强类型对象时。这将防止在编译时发生不好的事情。

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

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


问题是,当您可以使用强类型对象时。这将防止不好的事情在编译时发生。

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

Equals
是一种框架约定,在本例中为.NET,在运行时绑定

当您调用
时=,编译过程中由C#编译器做出决定,因此会出现错误。当您调用
Equals
时,框架将在运行时做出决定。由于您的枚举不是object类型,它将被转换为一个对象(装箱),然后运行时将检查您的类型是否覆盖了
Equals
方法,因为您没有覆盖,所以它将使用默认实现


等于参考类型的

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


等于值类型的


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

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

Equals
是一种框架约定,在本例中为.NET,在运行时绑定

当您调用
时=,编译过程中由C#编译器做出决定,因此会出现错误。当您调用
Equals
时,框架将在运行时做出决定。由于您的枚举不是object类型,它将被转换为一个对象(装箱),然后运行时将检查您的类型是否覆盖了
Equals
方法,因为您没有覆盖,所以它将使用默认实现


等于参考类型的

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


等于值类型的


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

还定义了一个方法Enum.IsDefined,我认为它可能对您有用。还有一个方法Enum.IsDefined,我认为它可能对您有用。两个答案几乎相同,但这一个更“针对我的基本水平”,所以我跨越了这一个。但这一切!两个答案几乎相同,但这一个更“针对我的基本水平”,所以我跨越了这一个。但这一切!