我有一个包含 Find 方法的自定义通用数据结构:
public bool Find(TValue value, IEqualityComparer<TValue> comparer)
{
foreach (var x in items)
{
if (comparer.Equals(value, x))
return true;
}
return false;
}
我最近从一位客户那里得到了一份报告,他说这会导致他的相等比较器抛出NullReferenceException
if value
isnull
或如果集合中的一个项目 is 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;
其次,Object.Equals的文档除其他外说:
x.Equals(null)
返回false
。- 的实现
Equals
不得抛出异常。
对我来说,这有力地证明了IEqualityComparer<T>.Equals应该优雅地处理空参数。
其他证据是IComparer.Compare的文档说:
允许将 null 与任何引用类型进行比较,并且不会产生异常。空引用被认为小于任何非空引用。
人们会期望IEqualityComparer<T>.Equals
采取类似的行动。不过,有趣的是,NullReferenceException
如果任一参数为null
.
我浏览了 、 、 和 的文档Object.Equals
以及IEquatable<T>
无数IEqualityComparer<T>
的IEqualityComparer
博客文章、文章和 SO 问题。没有任何关于如何处理null
参数的具体指导。
有这样的指导方针吗?如果没有,大师们有什么建议,为什么?