Es gibt zwei wichtige Dinge, die sich hier:
Zuerst Der Ausdruck "string" + 1
wird zur Laufzeit ausgewertet, während "string" + "1"
zur Compile-Zeit ausgewertet wird.
Zweitens verwenden Sie Referenzvergleich. Die von der Laufzeit generierten Strings verweisen auf ein anderes Objekt, während die generierten Strings zur Kompilierzeit auf dasselbe Objekt verweisen. Daher lautet der erste Ausdruck und der zweite Ausdruck true
.
Wenn Sie interessiert sind, die erzeugte IL ist:
// 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
Ich weiß nicht genau warum, aber ich weiß, Sie sollten nicht Zeichenfolge Qualität mit „==“ sowieso checken. object1.equals (object2) ist der Weg dahin, zumindest zu meinem Verständnis. Ich habe dies jedoch nicht als Antwort gepostet, weil es Ihre Frage wahrscheinlich nicht beantwortet. –
Überprüfen Sie dies: http://stackoverflow.com/questions/3398604/string-string-int-whats-behind-the-scene-c – Ani
@Ricky Mutschlechner: AFAIK der Operator '==' == '.equals'. ;-) –