Mientras examinaba al String ==operador, noté que llama String.Equals(string a, string b), lo que significa que es solo un paso.
Al examinar el String.Equals(string a, string b)método, veo que realiza una comprobación de igualdad utilizando el ==operador. ¿Cómo funciona esto realmente y no causa un problema StackOverflowExceptional hacer algo como "x" == "x"o "x" == "y"?
Actualización : se lo hice saber a JetBrains y lo convirtieron en una prioridad crítica para dotPeek. https://youtrack.jetbrains.com/issue/DOTP-6789
También agregué un problema en el repositorio de GitHub de ILSpy.


a == b), pero correcto en VB.NET:a Is b.Respuestas:
Tu descompilador tiene un error. El código real no verifica
a == b, verifica(Object)a == (Object)b, sin pasar por el operador sobrecargado.fuente
object.ReferenceEquals(a,b)sería mucho más claro ..object.ReferenceEqualsde la versión de transmisión (por ejemplo, ¿quéapasa si es asínull?) Y, siempre que sepa qué es la transmisión, ciertamente no está ofuscado.(Object)a == (Object)byObject.ReferenceEquals(a, b)es igualmente legible, pero no me sorprendería siObject.ReferenceEquals(a, b)solo tuviera una pequeña posibilidad de no estar en línea si se alcanza la profundidad máxima en línea. MS hace muchas micro optimizaciones, ya que la mayoría de los bucles estrechos en el código de usuario terminan llamando al código de MS.Aquí está el código real de Microsoft. El operador
==se implementa a s==llamadas de operadorString.Equalsque se implementa como:Como puede ver, la comparación para la igualdad de la cadena se realiza mediante la
if ((Object)a==(Object)b)conversión de la cadenaobjecty luego la comparación. Entonces esto no llamará al operador sobrecargado==en la clase de cadena.fuente