[C#] 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 저장소에 문제를 추가했습니다.

문자열 평등



답변

디 컴파일러에 버그가 있습니다. 실제 코드 는 오버로드 된 연산자를 무시하고 a == b검사하고 검사합니다 (Object)a == (Object)b.


답변

다음 은 Microsoft의 실제 코드입니다. 운영자 ==는 s를 구현

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

다음 과 같이 구현되는 운영자 ==호출 :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한 다음 비교를 수행하여 수행됩니다. 따라서 이것은 ==문자열 클래스에서 오버로드 된 연산자 를 호출하지 않습니다 .


답변