gpt4 book ai didi

c# - IEqualityComparer.Equals 的实现是否应该允许空值?

转载 作者:IT王子 更新时间:2023-10-29 04:21:59 31 4
gpt4 key购买 nike

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

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

我最近收到一位客户的报告,他说这导致他的相等比较器抛出 NullReferenceException如果valuenull或者如果集合中的一项是 null .

我最初的 react 是他的 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 的文档说:

Comparing null with any reference type is allowed and does not generate an exception. A null reference is considered to be less than any reference that is not null.

人们会期望 IEqualityComparer<T>.Equals以同样的方式行事。不过有趣的是,该页面上给出的示例将抛出 NullReferenceException。如果任一参数为 null .

我已经阅读了 Object.Equals 的文档, IEquatable<T> , IEqualityComparer<T> , 和 IEqualityComparer ,以及无数的博客文章、文章和 SO 问题。没有给出任何关于如何处理 null 的具体指南参数。

是否存在此类指南?如果不是,大师们推荐什么,为什么?

最佳答案

在 .NET Framework 本身中,所有 IEqualityComparer.Equals 方法都应该建模的最接近的方法是静态 Object.Equals(object,object)方法。根据文档,此方法可以优雅地处理 null。我认为这足以说明 .NET 设计者的意图:IEqualityComparer.Equals 也应该处理空值,并且应该以类似的方式处理它们(即处理两个 null彼此相等)。

关于c# - IEqualityComparer.Equals 的实现是否应该允许空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13831725/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com