То, что вы описываете, является правильным поведением.
Определение ==
в Object
сравнивает ссылки его аргументов. Это отличается от реализации ==
для String
, которая сравнивает значения строк. Операторы в C # не являются виртуальными. Это означает, что даже если ваши объекты на самом деле являются строками, потому что статический тип - object
, вызывается ==
из Object
, что означает сравнение ссылок.
В C # строки могут быть interned в пуле intern. Обычно, когда вы создаете новые строки во время выполнения, вы получаете ссылку на совершенно новый строковый объект. Чтобы получить интернированную строку, вы можете вызвать метод string.Intern . Однако, когда вы компилируете код C #, буквенные строки интернируются автоматически для вас, поэтому, если у вас в коде одна и та же буквальная строка в двух местах, вы получите ссылку на один и тот же строковый объект.
В ближайшем окне строки, по-видимому, не интернированы - новые строки создаются каждый раз, даже если они имеют одинаковое значение. Но в .NET не требуется, чтобы все строки были интернированы, поэтому я не считаю это ошибкой.
Ваш код не должен полагаться на то, являются ли строки интернированными, так как это деталь реализации.