Приведение нулевой символьной ссылки к String()

#c# #.net

#c# #.net

Вопрос:

В C # .net, если я беру string.Empty и вызываю .FirstOrDefault() на нем, намереваясь получить первый символ строки, он вернет нулевую символьную ссылку, т.Е. , а не нулевой символ, т.Е. char? . Тогда приведение этой toString() не имеет того же значения, что и string.Empty

Итак, основываясь на моем тестировании, следующие утверждения, похоже, разрешаются в true:

string.Empty.FirstOrDefault().ToString() != string.Empty

((char?)null).ToString() == string.Empty

string.Empty.FirstOrDefault().ToString() == ''.ToString()

Мне только кажется, или это кажется непоследовательным? Изначально для меня это не было очевидно, и я предполагал, что string.Empty.FirstOrDefault().ToString() это приведет к тому же значению, что и string.Empty . Кто-нибудь может связать меня с документацией, которая более подробно описывает это исправление?

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

1. Что string.Empty.FirstOrDefault() возвращает? Как вы думаете, почему это так? Кроме того, создайте пустой массив целых чисел с именем bob . Что bob.FirstOrDefault() вернулось бы и почему?

2. Да, я понимаю это, но тогда почему ''.ToString() != string.Empty ?

3. В одной руке у меня контейнер для яиц, в котором нет яиц. У меня есть другой контейнер для яиц с одним яйцом в нем, но в этом яйце нет желтка. Имеют ли эти два контейнера для яиц одинаковое содержимое? У меня есть строка, в которой нет символов. У меня есть строка с (по общему признанию, нечетным) символом в ней. Равны ли эти две строки?

Ответ №1:

string является IEnumerable<char> , поэтому FirstOrDefault() возвращает значение в пустой строке default(char) , а не default(char?) .

default(char) является '' .

(Почти) невозможно написать универсальный метод, который работает со ссылочными типами, но возвращает T? для типов значений (что вы и ожидаете здесь).

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

1. Документы, увы, не охватывают всего, что каждый возможный человек не может понять @Oxymoron. Проблема здесь в том, что ваша ментальная модель неверна. Вы спрашиваете «почему эти две разные вещи не равны», и ответ, как ни странно, заключается в том, что они не равны.

2. «почему строка с обнуляемыми символами не будет соответствовать значению строки. «Пустой», поскольку string.Empty в нем нет символов. Вы запрашиваете First OrDefault и получаете default(char) ответ (потому что нет «First»). string.Empty != ""

3. @Oxymoron: Да; это именно то, что есть.

4. Итак, позвольте мне прояснить — набор нулевых символов не равен отсутствию символов?

5. @Oxymoron правильный. Нулевой символ — это символ.

Ответ №2:

  1. string.Empty = "" представляет собой массив символов длины 0 .
  2. string.Empty.FirstOrDefault() является default(char) тем, что есть '' ( FirstOrDefault<T> возвращает default(T) , если исходный код пуст)
  3. string.Empty.FirstOrDefault().ToString() = default(char).ToString() = ""
  4. char? является Nullable<char> , если вы проверите ToString() реализацию на Nullable

 public override string ToString()
{
  if (!this.hasValue)
    return "";
  return this.value.ToString();
}
  

что означает, ((char?)null).ToString() возвращает "" (или string.Empty ).