Рассмотрим следующий код C#:
var a = "123";
var b = 123.ToString();
Console.WriteLine(a==b);
Console.WriteLine(ReferenceEquals(a, b));
Console.WriteLine("a interned? " + string.IsInterned(a));
Console.WriteLine("b interned? " + string.IsInterned(b));
Console.WriteLine(
ReferenceEquals(
string.IsInterned(a),
string.IsInterned(b)
)
);
Это выводит
True
False
a interned? 123
b interned? 123
True
Все в этом имеет смысл, за исключением того, почему ReferenceEquals(a,b)
возвращает false, учитывая, что a
был интернирован, а затем b
будет ссылаться на a
, как указано проверками string.IsInterned
.
123.ToString();
зависит отCultureInfo.CurrentCulture
и поэтому не может вычисляться во время времени компиляции (и, следовательно, интернируется) - person Dmitry Bychenko   schedule 04.10.2019123.ToString()
не интернирован, тоIsInterned()
должен был вернутьnull
, а вместо этого вернул строку. - person Dmitri Nesteruk   schedule 07.10.2019