#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:
string.Empty
=""
представляет собой массив символов длины0
.string.Empty.FirstOrDefault()
являетсяdefault(char)
тем, что есть''
(FirstOrDefault<T>
возвращаетdefault(T)
, если исходный код пуст)string.Empty.FirstOrDefault().ToString()
=default(char).ToString()
=""
char?
являетсяNullable<char>
, если вы проверитеToString()
реализацию наNullable
public override string ToString()
{
if (!this.hasValue)
return "";
return this.value.ToString();
}
что означает, ((char?)null).ToString()
возвращает ""
(или string.Empty
).