コードインスペクション: 意図しない参照比較の可能性がある検査です。
C# コンパイラーは、相互に継承する型のオブジェクトに対して等価演算子(== または != )を使用し、これらの演算子をオーバーライドする型のうちの 1 つのみの型の場合に、「意図しない参照の比較」警告(CS0252/CS0253 )を発行します。
いずれかの型で等価演算子がオーバーライドされるということは、この型のオブジェクトが比較されるときに 値が等しいことが期待されることを意味します。 これらのオブジェクトを等価演算子がオーバーライドされていない型のオブジェクトと比較すると、 参照の等価性をチェックする System.Object のオーバーロードが使用されることになります。 この状況ではオブジェクト参照の比較が誤っている可能性が高いため、警告が発行されます。
JetBrains Rider はこれらの警告を認識し、それらに対する 設計時の通知を提供しますが、さらに一歩進んで、意図しない参照比較の可能性がある別のケース、つまり比較される型の一方だけが Equals() をオーバーライドする場合も検出します。 2 番目のオブジェクトの型に対して Equals() がオーバーライドされていない場合、比較は System.Object の Equals() の実装にフォールバックされ、参照同一性チェックが実行されますが、これは値型には望ましくない可能性があります。
両方の状況を示すコード一覧を示します。
このインスペクションのもう 1 つのケースは、等価演算子(== または != )を使用してインターフェースタイプを比較することです。 これらの演算子は静的であるため、インターフェースの実装で等価演算子が値の比較にオーバーライドされた場合でも、コンパイラーはデフォルトで System.Object.ReferenceEquals() (つまり、参照比較)になります。
JetBrains Rider は、等値演算子や Equals() をオーバーライドするインターフェース実装を探し、そのような実装を検出すると警告を発行します:
このインスペクションはソリューション全体(参照ライブラリを含む)でインターフェースの実装を探しますが、その場所は必ずしも明らかではありません。 以下の例では、JetBrains Rider は mscorlib 内で Equals() をオーバーライドする ICollection<object> の実装を検出し、たとえ独自の ICollection<object> の実装が Equals() や等値演算子をオーバーライドしていなくても警告を発行します。
このケースは少し慎重に思えるかもしれませんが、インターフェースを比較するために非静的メソッドを使用すると、コードがより簡単になり、おそらくより安全になる可能性があります。 つまり、参照等価をチェックする場合は ReferenceEquals() 、実装ではそれがオーバーライドされると予想される場合は Equals() 、コレクションには同じ順序で同じオブジェクトが含まれるかどうかをチェックする Enumerable.SequenceEqual() などの特定のメソッドを使用できます。