IEqualityComparer.Equals的实现是否应允许空值?

Jim*_*hel 25 c# generics equality

我有一个包含Find方法的自定义通用数据结构:

public bool Find(TValue value, IEqualityComparer<TValue> comparer)
{
    foreach (var x in items)
    {
        if (comparer.Equals(value, x))
            return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我最近从一位客户那里得到了一份报告,他说这会引起他的平等比较,NullReferenceException如果value是,null或者如果该集合中的一个项目是null.

我最初的回答是他的IEqualityComparer<T>.Equals实现是错误的,因为它没有优雅地处理null值.但我还没有找到任何明确支持我的文件.我有一些证据表明我是对的,但没有任何明确的说明.

首先,我已经改变了这个简单的调用,这似乎很愚蠢comparer.Equals:

if (x == null)
{
    if (value == null)
        return true;
}
else if (value != null && comparer.Equals(value, x))
    return true;
Run Code Online (Sandbox Code Playgroud)

其次,Object.Equals的文档说,除其他外:

  • x.Equals(null)回报false.
  • 实现Equals不能抛出异常.

对我来说,这是IEqualityComparer <T> .Equals应该优雅地处理空参数的有力证据.

其他证据是IComparer.Compare的文档说:

允许将null与任何引用类型进行比较,并且不会生成异常.空引用被认为小于任何非null引用.

人们期望IEqualityComparer<T>.Equals采取类似行动.但是,有趣的是,NullReferenceException如果任一参数是,则该页面上给出的示例将抛出null.

我经历过的文档Object.Equals,IEquatable<T>,IEqualityComparer<T>,和IEqualityComparer,和无数的博客文章,文章等问题.没有任何关于如何处理null参数的具体指导.

这样的指南是否存在?如果没有,大师会推荐什么,为什么?

das*_*ght 24

.NET框架本身中最接近的方法IEqualityComparer.Equals是在静态Object.Equals(object,object)方法之后建立所有方法.根据文档,这个方法null优雅地处理.我认为这为.NET设计者的意图提供了足够的指示:IEqualityComparer.Equals应该处理空值,并且它应该以类似的方式处理它们(null即将两个s视为彼此相等).