Комментарии 5
В первом случае с ReferenceEquals, может это из-за интерирования сделано?
var a = "abc";
var b = "abc";
Вот здесь для двух переменных может использоваться одна строка в памяти и referenceEquals будет давать true
Не. Там struct передается в object, то есть будет выполняться boxing. Нет смысла сравнивать ссылки объектов, если для одного объекта будет выделяться новое место в куче при каждом вызове этой функции. Результат всегда будет false.
В некоторых проектах (например DnSpy) некоторые структуры боксятся и кешируются в статичных полях, чтобы не выделять их в памяти по 100500 раз для использования в методах, принимающих object вместо struct. Также с учётом CommunityToolkit.HighPerformance.Box<T> где T: struct (использует тот же layout, что и обычный box. Черная unsafe магия с Unsafe.As<T, X>(ref T t)), можно object один раз выделить и переиспользовать для структуры.
А так этот шаблон с Equals(object) везде одинаковый и автоматически создаётся IDE без разбора struct или class. А дальше никто его не правит.
Ошибки и подозрительные места в исходниках .NET 9