String.Equals(a,b)如何不产生StackOverflowException?

在检查String ==运算符时,我注意到它调用了String.Equals(string a, string b) ,意思是它只是一个传递。

检查String.Equals(string a, string b)方法,我发现它使用==运算符进行了相等性检查。 这是如何工作的,而不是像"x" == "x""x" == "y"这样的东西造成StackOverflowException

更新 :我让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); } 

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); } 

正如你看到的,string相等的比较是使用if ((Object)a==(Object)b)将string转换为object ,然后进行比较来完成的。 所以这不会调用string类中的重载运算符==