繁体   English   中英

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

[英]Is it ever acceptable to return True when the parameter to Equals is a null reference?

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); 
    }
}

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 (引用类型),则答案肯定是“ 否”

其实不是。 当两个对象为null时,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

指示当前Nullable值是否等于指定的对象

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM