实现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,则指定这种或那种方式.
ReSharper错了.
显然,您编写的代码可以调用该特定GetHashCode方法并传入null值.所有已知的方法都可能确保这种情况永远不会发生,但显然ReSharper只能考虑现有的代码(模式).
所以在这种情况下,检查null并做"正确的事情".
推论:如果有问题的方法是私有的,那么ReSharper可能会分析(虽然我不确定它)公共代码并验证确实没有办法用null引用调用这个特定的私有方法,但是因为它是一个公共方法,然后通过接口可用
ReSharper错了.