立即窗口中的C#==运算符与运行时的行为不同

Dam*_*sco 9 c# equality equals

在立即窗口中尝试以下操作:

object a1 = "a";
object a2 = "a";
a1==a2 // outputs false
Run Code Online (Sandbox Code Playgroud)

你会看到a1 == a2输出false.

但是,在运行时窗口应用程序或控制台中,您将获得true:

object t1 = "a";
object t2 = "a";
MessageBox.Show((t1 == t2).ToString()); // outputs true
Run Code Online (Sandbox Code Playgroud)

运行时行为与==运算符和字符串的定义一致.

有人知道这是立即窗口中的错误吗?

Mar*_*ers 15

你所描述的是正确的行为.

==in 的定义Object比较了其参数的引用.这是实施不同==String,其比较的字符串.C#中的运算符不是虚拟的.这意味着,即使你的对象实际上是字符串,因为静态类型是object==Object被称为,这意味着一个参考比较将会作出修改.

在C#字符串可以拘禁在实习生池.通常,在运行时创建新字符串时,您会收到对全新字符串对象的引用.要获取实习字符串,可以调用string.Intern方法.但是,当您编译C#代码时,文字字符串会自动为您实现,因此如果您在代码中的两个位置具有相同的文字字符串,您将获得对同一字符串对象的引用.

在即时窗口中,字符串显然没有实现 - 每次创建新字符串即使它们具有相同的值.但是.NET中没有要求所有字符串必须被实现,所以我不认为这是一个错误.

您的代码应该避免依赖于字符串是否被实现,因为这是一个实现细节.

  • 只是为了清楚OP:操作符不参与多态,所以在这种情况下它是`==`的`Object`实现,而不是`String`实现,因此这种意外的行为. (3认同)