In a generic GetHashCode(T foo) method, I check whether foo is null.
However I just stumbled upon a strange Resharper warning.
In the following code, can foo never be null?
private class FooComparer<T> : IEqualityComparer<T> where T: Foo
{
public int GetHashCode(T foo)
{
// resharper warning: "Expression is always false"
if (Object.ReferenceEquals(null,foo)) return 0;
// ... calculate hash
}
}
However as far as I can tell, the following is perfectly legal:
Foo foo = null;
var fooComparer = new FooComparer<Foo>();
int hash = fooComparer.GetHashCode(foo);
Method
IEqualityComparer<T>.GetHashCodehas contract[NotNull]for its parameter because it has implementations that throw an exception whennullis provided as an argument.If you want to use
FooComparer<T>.GetHashCodedirectly and exception-safe fornullas its argument, you can annotate it as follows:Nevertheless analysis for
[Not-Null]-parameters must be improved. This bug exists for similar code in http://youtrack.jetbrains.com/issue/RSRP-304111