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,我宁愿得到编译时错误。
为什么第一种方式通过而第二种方式没有?
答案 0 :(得分:3)
这是因为默认的虚拟Equals方法正在接收对象而不是像第二个示例中那样的强类型值。它被装入对象并仅在运行时检查类型。
为什么这样做?推理非常有趣 - 如果他们四肢行走,可以比较猫和狗。通过一些几乎相同的属性比较两个完全不同的对象。
事情是,当你可以 - 使用强类型对象。这样可以防止在编译时发生不良事件。
答案 1 :(得分:2)
!=
是一种语言约定,因此这是C#特有的。调用此运算符是早期绑定,换句话说,它将在编译时发生。
Equals
是一种框架约定,在这种情况下是.NET,并且在运行时绑定。
当您调用!=
时,编译期间C#编译器会做出决定,因此您会收到错误消息。当您调用Equals
时,框架会在运行时做出决定。由于你的枚举不是类型对象,它将变成一个对象(装箱)然后运行时将检查你的类型是否覆盖了Equals
方法,因为你没有,它将使用默认实现。
Equals
如果实例是引用类型,则Equals
的默认实现检查一个对象引用是否与另一个对象引用相同。如果它们是相同的引用,则返回true。否则返回false。
Equals
如果实例是值类型,那么它将测试值相等性。这是你的情况。它将检查您的枚举值是否等于常量值。不会显示或抛出错误:它等于或不等。