当Equals的参数为空引用时,返回True是否可以接受?

时间:2009-10-07 23:31:40

标签: c# .net

Object.Equals的文档说如果参数是空引用,则实现者必须返回false。

在我的课堂上,我要覆盖Equals来检查价值平等。我有一个类似于Nullable (T)结构的成员变量。当我传递一个空引用并且我的结构的HasValue属性为False时,我最初的倾向是返回True。

当Equals的参数为空引用时,返回True是否可以接受?

修改 例如:

class ExampleClass {

    SomeValueType? x;

    bool Equals(object other) {
        if (other == null) return false; // <-- returns a different value than x.Equals
        return x.Equals(other); 
    }
}

2 个答案:

答案 0 :(得分:6)

Nullable<T>.Equals(object)如下:

public override bool Equals(object other)
{
    if (!this.HasValue)
    {
        return (other == null);
    }
    if (other == null)
    {
        return false;
    }
    return this.value.Equals(other);
}

因此,对于具有可空语义的struct(值类型),您的问题的答案是肯定的。如果您的类型是class(引用类型),则答案肯定是

答案 1 :(得分:1)

实际上并非如此。当两个对象为空时,equals方法不能返回true。

为什么?

当你定义

AnObject obj;

obj是对象的引用(我在谈论Java,但这必须是OO概念)

Object.Equals方法接受一个必须是对象的参数,但null不是对象。

所以null.Equals(null)对于OO来说不是一种可接受的方法。

编辑:

这就是为什么==运算符与obj.Equals方法不同的原因。 null == null返回true而没有任何头痛。

Edit2:.Net似乎与Equals方法不一致,可能会受到另一个主题的影响。

int? a = null;
a.Equals(null); // returns true without any problem.

但:

Nullable<T>.Equals方法的定义如下:

Nullable<T>.Equals(object obj):bool
  

表示当前是否   可空值等于a   指定对象

由于null不是对象,因此文档或实现都不正确。

相关问题