私はC#で平等を探していて、この行に沿って何かを実装していました:
public class MyType
{
public string MyProperty { get; set; }
public MyType(string myProperty)
{
MyProperty = myProperty;
}
protected bool Equals(MyType other)
{
Console.WriteLine("I'm calling the MyType.Equals override");
return MyProperty == other.MyProperty;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((MyType) obj);
}
public override int GetHashCode()
{
throw new NotImplementedException();
}
public static bool operator ==(MyType lhs, MyType rhs)
{
return Equals(lhs, rhs);
}
public static bool operator !=(MyType lhs, MyType rhs)
{
return !(lhs == rhs);
}
}
class Program
{
static void Main(string[] args)
{
var type1 = new MyType("test");
var type2 = new MyType("test");
Console.WriteLine($"type1 == type2 => {type1 == type2}");
Console.Read();
}
}
そして出力は
MyType.Equals オーバーライド
type1 == type2 => Trueを呼び出しています
このように等値演算子をオーバーライドすることによって生じる可能性のある驚きを十分に認識していますが、知りたいのは、インスタンスの仮想メソッド (protected bool Equals(MyType other) in MyType ) を呼び出すことができる理由です。クラス) 静的メソッドから。
わかりました、実際には静的メソッドのようには見えません。
オペレーター
キーワードですが、私が知る限り、IL では静的メソッドとして変換されます。
.method public hidebysig specialname static bool op_Equality(class MyType lhs, class MyType rhs) cil managed
object.Equals 静的メソッド呼び出しのどこかで魔法が発生すると思われますが、実際にどのように機能するかはわかりません。光を当ててみませんか?