什么时候generics参数永远不会为空

在通用的GetHashCode(T foo)方法中,我检查foo是否为null 。 然而,我偶然发现了一个奇怪的Resharper警告。

在下面的代码中, foo永远不会为null吗?

 private class FooComparer : IEqualityComparer where T: Foo { public int GetHashCode(T foo) { // resharper warning: "Expression is always false" if (Object.ReferenceEquals(null,foo)) return 0; // ... calculate hash } } 

但据我所知,以下是完全合法的:

 Foo foo = null; var fooComparer = new FooComparer(); int hash = fooComparer.GetHashCode(foo); 

方法IEqualityComparer.GetHashCode的参数具有契约[NotNull] ,因为它具有在将null作为参数提供时抛出exception的实现。

如果要直接使用FooComparer.GetHashCode并将null作为其参数的exception安全,则可以按如下方式对其进行注释:

 public int GetHashCode([JetBrains.Annotations.CanBeNull] T foo) { // resharper warning: "Expression is always false" if (Object.ReferenceEquals(null,foo)) return 0; // ... calculate hash } 

然而,必须改进对[Not-Null]参数的分析。 http://youtrack.jetbrains.com/issue/RSRP-304111中的类似代码存在此错误

IEqualityComparer.GetHashCode Method MSDN说:

例外:

ArgumentNullException obj的类型是引用类型, objnull

这似乎意味着使用null参数调用GetHashCode(T obj)违反了IEqualityComparer的约定。

我假设Resharper假定调用者遵守该契约,因此永远不会传入null