实现IEqualityComparer时,GetHashCode应该检查null吗?

Fri*_*Guy 9 c# hash

实现IEqualityComparer<Product>(Product是一个类)时,ReSharper会抱怨下面的空检查始终为false:

public int GetHashCode(Product product)
{
  // Check whether the object is null. 
  if (Object.ReferenceEquals(product, null))
    return 0;

  // ... other stuff ...
}
Run Code Online (Sandbox Code Playgroud)

(来自Enumerable.Except的MSDN VS.9文档的代码示例)

ReSharper可能是错的,但在搜索答案时,我遇到了官方文档,IEqualityComparer<T>其中有一个示例,其中未检查null:

public int GetHashCode(Box bx)
{
    int hCode = bx.Height ^ bx.Length ^ bx.Width;
    return hCode.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)

此外,该文档GetHashCode()的状态的是ArgumentNullException将被抛出时"类型obj的是引用类型和obj为null".

因此,在实现时IEqualityComparer应该GetHashCode检查null,如果是,那么它应该用null做什么(抛出异常或返回一个值)?

我最感兴趣的是.NET框架官方文档,如果应该检查null,则指定这种或那种方式.

ang*_*son 9

ReSharper错了.

显然,您编写的代码可以调用该特定GetHashCode方法并传入null值.所有已知的方法都可能确保这种情况永远不会发生,但显然ReSharper只能考虑现有的代码(模式).

所以在这种情况下,检查null并做"正确的事情".


推论:如果有问题的方法是私有的,那么ReSharper可能会分析(虽然我不确定它)公共代码并验证确实没有办法用null引用调用这个特定的私有方法,但是因为它是一个公共方法,然后通过接口可用

ReSharper错了.