Как стать автором
Обновить

Комментарии 25

На первый вопрос в голову приходит такой ответ:
object x = new string(new char[0]);
object y = new string(new char[0]);
Console.WriteLine(x == y);
На второй — явно связано с опциональными параметрами и констрейнтами, но у меня не получилось заставить код компилироваться :-(
Неа. Строки запаковываются в объекты и будут разными объектами. А вот new bool?() подходит.
Cтроки — не value type чтобы запаковываться. А тут true будет банально из-за интернирования.
Не обратил внимания на нолик в char[0]. Да, так сработает. Но если ввести так непустые строки (но одинаковые) — будет false.
На мсдн написано что оператор == для реф тайпов сравнивает ссылки кроме string. Все верно, как и гдето было написано что стринг это реф тип ведущий себя как валю.
Нет, был неправ.
Во-первых, мой вариант не компилируется.
Во-вторых, даже следующий вариант вернёт false:
 object x = new string(new[] {'H', 'e', 'l', 'l', 'o'});
object y = new string(new[] {'H', 'e', 'l', 'l', 'o'});
 bool res = x == y;

А вот следующий код вернёт true.
string a = "Hello";
string b = "Hello";
 bool res1 = a == b;
Так смысл вопроса был именно в создании новых объектов с помощью new
Не понимаю почему Ваш первый вариант не возвращает true (интернирование не работает?).
Рекомендую ознакомиться вот с этой замечательной статьей дядьки Э. Липперта. Он даёт объяснение этому поведению.
object x = new string(new[] {'H', 'e', 'l', 'l', 'o'});
object y = new string(new[] {'H', 'e', 'l', 'l', 'o'});
bool res = x == y;

Интернирование работает только для строковых литералов. В данном же случае будут созданы два разных объекта, а поскольку тип времени компиляции — object, то сравниваться будут ссылки, которые не равны. Именно поэтому результат false.
А для особо интересующихся можно попробовать понять почему код выше выводит True, а
object x = new String(new char[1]{'A'});
object y = new String(new char[1]{'A'});
Console.WriteLine(x == y);

уже False

… ох давно я комментарии не обновлял…
А в третьем вариенте возможно использование локальной переменной своего типа и дополнительных методов расширения из Linq.
Нет не вышло =(
Он #1 all time rank. Ближайший 475k
<зануда>
Надо заметить, что он всё-таки Jon, а не John.
</зануда>
Я заметил, когда отредактировать комментарий стало невозможно :)
Отличный парень. Очень приятный в общении. На SO часто отвечает на интересные вопросы. И всегда добр и дружелюбен.
Да. Даже по его книге это очень хорошо чувствуется. Конечно, в предисловии немного смеешься над фразой «я простой разработчик», но в общем-то все так и есть :).
Мой секрет заключается в том, что я действительно не знаю другие языки программирования. Я достаточно знаю VB, чтобы отвечать на некоторые вопросы на StackOverflow, и я могу читать некоторые вопросы по F#, но я очень не многоязычен в этом смысле.

Отсутствие скромности — не про него. Стоит взглянуть на его теги, чтоб понять, что кругозор огромен. В частности его ответы по scala. В свое время был очень удивлен, обнаружив чей ответ по скале только что прочитал.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории