Как String.Equals(a, b) не создает исключение StackOverflowException?

При рассмотрении оператора String == я заметил, что он вызывает String.Equals(string a, string b), что означает его просто прохождение.

Изучая метод String.Equals(string a, string b), я вижу, что он выполняет проверку равенства с помощью оператора ==. Как это работает и не вызывает StackOverflowException при выполнении чего-то вроде "x" == "x" или "x" == "y"?

Обновление. Я даю знать JetBrains, и они сделали его критическим приоритетом для dotPeek. https://youtrack.jetbrains.com/issue/DOTP-6789

Я также добавил проблему в репозитории ILSpy GitHub.

String Equality

Ответ 1

В вашем декомпиляторе есть ошибка. Настоящий код не проверяет a == b, он проверяет (Object)a == (Object)b, минуя перегруженный оператор.

Ответ 2

Здесь - настоящий код от Microsoft. Оператор == реализовал s

public static bool operator == (String a, String b) {
   return String.Equals(a, b);
}

operator == вызывает String.Equals который реализован, как:

public static bool Equals(String a, String b) {
    if ((Object)a==(Object)b) {
        return true;
    }

    if ((Object)a==null || (Object)b==null) {
        return false;
    }

    if (a.Length != b.Length)
        return false;

    return EqualsHelper(a, b);
}

Как вы видите, сравнение для равенства строк выполняется с помощью if ((Object)a==(Object)b), переводя строку в object, а затем выполнив сравнение. Таким образом, это не вызовет перегруженный оператор == в строковый класс.