请帮助理解这种行为。当我使用这个时:
bool a1 = (object)("string" + 1) == ("string" + 1);
结果是
false
但是当我使用这个
bool a2 = (object)("string" + "1") == ("string" + "1");
结果是
true
那么,为什么
a1 != a2
?
强制转换为
object
强制进行参考相等比较。
在第一种情况下,在运行时生成两个不同的
string
对象。由于它们是不同的实例,因此结果是错误的。
在第二种情况下,编译器注意到
"string" + "1"
始终是 "string1"
并实习该字符串并在两个地方使用相同的引用。由于是相同的字符串引用,因此结果为 true。
这里发生了两件重要的事情:
首先,表达式
"string" + 1
在运行时计算,而 "string" + "1"
在编译时计算。
其次,您正在使用参考比较。运行时生成的字符串实际上引用了不同的对象,而编译时生成的字符串引用了同一个对象,因此第一个表达式是
false
,第二个表达式是 true
。
如果你有兴趣,生成的IL是:
// bool a1 = (object)("string" + 1) == ("string" + 1);
// bool a2 = (object)("string" + "1") == ("string" + "1");
IL_0000: ldstr "string"
IL_0005: ldc.i4.1
IL_0006: box System.Int32
IL_000B: call System.String.Concat
IL_0010: ldstr "string"
IL_0015: ldc.i4.1
IL_0016: box System.Int32
IL_001B: call System.String.Concat
IL_0020: ceq
IL_0022: stloc.0 // a1
IL_0023: ldstr "string1"
IL_0028: ldstr "string1"
IL_002D: ceq
IL_002F: stloc.1 // a2