Это из-за интернирования строк.
s2 - компилятор уберёт сложение и сразу запишет туда "abccba"
Соответственно s2 и s3 будут иметь одну и ту же ссылку.
string.Format - создаст отдельный объект с другой ссылкой.
Поэтому:
1) True, потому, что вызывается перегруженный оператор сравнения для строк.
2) False, потому, что ссылки не равны.
3) True, потому, что вызывается перегруженный оператор сравнения для строк.
4) True, потому, что ссылки равны.
var s2 = "abc" + "cba";
var s3 = "abccba";
Console.WriteLine(s1 == s2);
Console.WriteLine((object)s1==(object)s2);
Console.WriteLine(s2==s3);
Console.WriteLine((object)s2==(object)s3);
Почему обьект s1 не будет равен обьекту s2, но при этом обьект s3 будет равен обьекту s2 ? Они же все имеют одинаковое значение, так в чем причина