Оператор ==
не является синонимом, это оператор, который определен для разных типов.
Оператор ==
определен для строк, а затем он действительно использует метод Equals
:
public static bool operator ==(string a, string b) {
return Equals(a, b);
}
Однако в вашем коде вы не используете оператор для строк, вы используете его для объектов, так что вы получите оператор ==
, определенный для объектов, который использует ReferenceEquals
чтобы сделать сравнение.
Какая перегрузка используемого оператора определяется во время компиляции, поэтому именно тип переменных, определяющих перегрузку, а не фактический тип объектов, на которые указывают переменные.