C# operator==の話

c#は独自クラスであってもoperator==operator<などを定義することで。プリミティブ型のように比較できることを知った。演算子をオーバーロードできる言語だったとは知らず、割と驚いた。

しかし、このあたりの実装はc++のように単純ではないようだ。

そもそも、c#はobjectを比較する方法が沢山あってややこしい。==だけでなく、object.Equals()IEquatable<T>を継承して実装するTypeSafeなobject.Equals()object.ReferenceEquals()などが最初から用意されている。

c#ではstructとclassを明確に使い分けており、classは参照型のため、==演算子はデフォルトで参照の等価性を評価する。operator==を上書きすることで値の比較に変えることができるが、その場合は他のメソッドも上書きすることを求められるようだ(例えばHashCode()とか)。

あと地味に罠なのがnullチェックだ。

public static operator==(Type a, Type b) 
{
    if (a == null || b == null) ...
}

と書くと、==演算子で再帰してしまう。

public static operator==(Type a, Type b) 
{
    if (a is null || b is null) ...
}

と書かないといけないようだ。

演算子==の定義を変えるのは割と厄介だった。あまり乱用しない方がいいのかもしれない。