Я ковыряться с равенством в 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
, в то время как я полностью осведомлен о возможных неожиданностях, которые могут возникнуть в результате переопределения оператора равенства таким образом, что я хотел бы знать, почему это можно вызвать вызов виртуального метода экземпляра (защищенный bool Equals (MyType other) в классе MyType) из статического метода.
Хорошо, это не выглядит как статический метод данного оператору
ключевое слово, но, насколько я могу сказать, что переводится как статический метод в IL:
.method public hidebysig specialname static bool op_Equality(class MyType lhs, class MyType rhs) cil managed
Я подозреваю, что магия происходит где-то в объекте. Статический метод вызова Equals, но я не знаю, как это работает. Уход, чтобы пролить свет?
Включение точки останова в этот метод, отладка кода и проверка стека вызовов - довольно простая отладка и позволит вам увидеть серию вызовов, которые задействованы. –
@Damien_The_Unbeliever мое глупое сомнение не имело никакого отношения к стеку вызовов, но по какой-то причине оно просто не нажимало на меня, что статический метод может вызывать методы экземпляра других объектов. Я не знаю точно, почему у меня возникло это сомнение в этом конкретном случае, это не имеет никакого смысла. –