Здравствуйте, Kolesiki, Вы писали:
K>Тема для многих не новая, но её тупость не теряет актуальности.
Тупость не теряет актуальности, но вот Майкрософта ли?..
K>Речь идёт об "интернировании строк"
Интернирование тут ни при чём. При чём дефолтный компаратор. Если ты не передаёшь компаратор в явном виде, то подписываешься на то, что его выберут за тебя.
K>В какой идиотской стране два одинаково выглядящих дома имеют ОДИН АДРЕС?
K>А чем строки отличаются от домов? Да ничем! Выглядеть одинаково != быть одним и тем же.
Вот тебе два разных одинаково выглядящих дома, имеющих разный адрес:
string s1 = "STRoka".ToLowerInvariant();
string s2 = "strOKA".ToLowerInvariant();
bool isInterned = string.IsInterned(s1) is not null;
Console.WriteLine($"{nameof(isInterned)}: {isInterned}"); // False
bool areReferenceEqual = ReferenceEquals(s1, s2);
Console.WriteLine($"{nameof(areReferenceEqual)}: {areReferenceEqual}"); // False
bool areSemanticallyEqual = string.Equals(s1, s2, StringComparison.Ordinal);
Console.WriteLine($"{nameof(areSemanticallyEqual)}: {areSemanticallyEqual}"); // True
List<string> list = new() { s1, s2 };
Console.WriteLine($"{nameof(list.IndexOf)}({nameof(s2)}): {list.IndexOf(s2)}"); // 0
K>Неужели им самим не прилетало от подобных оптимизаций?
K>По-уму, надо было оставить сравнение строк (s1 == s2) ровно таким же, как для объектов — через сравнение ссылок.
Обобщённые алгоритмы стандартной библиотеки не используют operator ==. Они используют либо переданный компаратор, либо дефолтный, который в свою очередь резолвит сравнение через переопределённый метод Equals, или фоллбэчатся к сравнению ссылок.