5

一般的なGetHashCode(T foo)方法では、であるかどうかを確認しfooますnull。しかし、私は奇妙なResharperの警告に出くわしました。

次のコードでは、foo決してできません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
    }
}

しかし、私が知る限り、以下は完全に合法です。

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

2 に答える 2

5

のためのMSDNはIEqualityComparer<T>.GetHashCode Method 言う:

例外:

ArgumentNullExceptionの型objは参照型であり、objですnull

これは、パラメータを使用して呼び出すGetHashCode<T>(T obj)と、nullのコントラクトに違反していることを意味しているようですIEqualityComparer<T>

Resharperは、発信者がその契約を順守していることを前提としているため、決して渡されないと思いますnull

于 2012-09-17T11:15:31.353 に答える
5

メソッドには、引数として提供されたときに例外をスローする実装があるため、パラメーターのIEqualityComparer<T>.GetHashCodeコントラクトがあります。[NotNull]null

引数としてFooComparer<T>.GetHashCode直接かつ例外安全性を使用する場合は、次のように注釈を付けることができます。null

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の同様のコードに存在します

于 2012-09-17T14:43:13.047 に答える