using System; public class Test { class ClassA { public string Value1 { get; protected set; } // コンストラクタ public ClassA(string val) { Value1 = val; } // == 演算子を定義 public static bool operator==(ClassA self, ClassA other) { return self.Value1 == other.Value1; } // == を定義するためには != もペアで定義が必要 public static bool operator!=(ClassA self, ClassA other) { return !(self == other); } } // ClassA を継承したクラス class ClassB : ClassA { public int Value2 { get; protected set; } public ClassB(string val1, int val2) : base(val1) { Value2 = val2; } // == をオーバーライド?(実は出来ていない) public static bool operator==(ClassB self, ClassB other) { return self.Value1 == other.Value1 && self.Value2 == other.Value2; } // == を定義するためには != もペアで定義が必要 public static bool operator!=(ClassB self, ClassB other) { return !(self == other); } } static void Main(string[] args) { // ClassA のインスタンスを比較 var a1 = new ClassA("A"); var a2 = new ClassA("A"); Console.WriteLine(a1 == a2); // True // ClassB のインスタンスを比較 var b1 = new ClassB("1", 10); var b2 = new ClassB("1", 20); Console.WriteLine(b1 == b2); // False <= Value2 の値が異なるので False // ClassA 型の変数に代入(キャスト) ClassA c1 = b1; ClassA c2 = b2; Console.WriteLine(c1 == c2); // True <= ここで、ClassAの==演算子が呼ばれている Console.WriteLine($"{c1.GetType().Name}, {c2.GetType().Name}"); // ClassB, ClassB <= 実体はどちらもClassB } }