Lo que está describiendo es comportamiento correcto.
La definición de ==
en Object
compara las referencias de sus argumentos. Esto es diferente de la implementación de ==
para String
que compara los valores de las cadenas. Los operadores en C# no son virtuales. Esto significa que, aunque sus objetos son realmente cadenas, porque el tipo estático es object
se llama al ==
de Object
, lo que significa que se realizará una comparación de referencia.
En C# las cadenas pueden ser interned en el grupo interno. Normalmente, cuando crea nuevas cadenas en tiempo de ejecución, recibe una referencia a un objeto de cadena completamente nuevo. Para obtener una cadena interna puede llamar al método string.Intern. Sin embargo, al compilar el código C#, las cadenas literales se internan automáticamente, por lo que si tiene la misma cadena literal en dos lugares del código, obtendrá una referencia al mismo objeto de cadena.
En la ventana inmediata las cadenas aparentemente no están intercaladas, se crean nuevas cadenas cada vez, incluso si tienen el mismo valor. Pero no hay ningún requisito en .NET de que todas las cadenas de caracteres se tengan que internar, por lo que no considero que se trate de un error.
Su código debe evitar depender de si las cadenas están intercaladas o no, ya que este es un detalle de implementación.
+1 solo porque nunca he visto la ventana Inmediato y parece clara! – RichK