Find メソッドを含むカスタム汎用データ構造があります。
public bool Find(TValue value, IEqualityComparer<TValue> comparer)
{
foreach (var x in items)
{
if (comparer.Equals(value, x))
return true;
}
return false;
}
私は最近、あるクライアントから、コレクション内の項目の 1 つが であるNullReferenceException
場合value
に等値比較器がスローされるという報告を受けました。null
null
私の最初の反応は、値IEqualityComparer<T>.Equals
を適切に処理していないため、彼の実装は誤りであるというものでした。null
しかし、明示的に私をバックアップするドキュメントを見つけることができませんでした。私が正しいことを示す証拠はいくつかありますが、明確なものはありません。
まず、単純な呼び出しを次のように変更するのはばかげているようですcomparer.Equals
。
if (x == null)
{
if (value == null)
return true;
}
else if (value != null && comparer.Equals(value, x))
return true;
第二に、Object.Equalsのドキュメントには、とりわけ次のように書かれています。
x.Equals(null)
戻りますfalse
。- の実装は
Equals
例外をスローしてはなりません。
これは、 IEqualityComparer<T>.Equalsが null パラメーターを適切に処理する必要があることの強力な証拠です。
その他の証拠は、IComparer.Compareのドキュメントに次のように記載されていることです。
null を任意の参照型と比較することは許可されており、例外は生成されません。null 参照は、null でない参照よりも小さいと見なされます。
IEqualityComparer<T>.Equals
同様に行動することが期待されます。ただし、そのページに示されている例はNullReferenceException
、いずれかのパラメーターがnull
.
Object.Equals
、IEquatable<T>
、IEqualityComparer<T>
、およびのドキュメントとIEqualityComparer
、数え切れないほどのブログ投稿、記事、および SO の質問に目を通しました。null
パラメータの処理方法に関する具体的なガイドラインはありません。
そのようなガイドラインは存在しますか?そうでない場合、教祖は何を推奨していますか? またその理由は何ですか?