Я только что обнаружил, что приведенный ниже код возвращает false
:
((byte)'\n').ToString().Contains('\n') // -> false
А вот этот возвращается true
:
'\n'.ToString().Contains('\n') // -> true
Почему это? Коды символов (byte)'\n'
и (char)'\n'
одинаковы, поскольку '\n' == 10
.
Это число может быть выражено как byte
(1B), так и char
(2B), поскольку 10 < 256, поэтому сохраненное значение должно быть одинаковым независимо от кодировки...
Я понятия не имею, почему это происходит, поскольку я относительно новичок в типизированных языках.
'\n'.ToString()
преобразует char
\n
в строку, и результатом является строка из одного символа с новой строкой.
(см. документацию по Char.ToString).
► Когда вы проверяете, содержит ли он новую строку, результат, естественно, true
.
((byte)'\n').ToString()
сначала преобразует char
\n
в byte
, что означает 8-битное целое значение значения 10
. Затем 10
преобразуется в строку и результатом является "10"
.
.
(см. документацию Byte.ToString).
► Эта строка не содержит новой строки, поэтому вы получаете false
из Contains
.
Вы можете наблюдать это, используя следующий фрагмент:
var s1 = '\n'.ToString();
var s2 = ((byte)'\n').ToString();
Если вы используете отладчик, вы увидите, что s1
— это "\n"
(т. е. строка с одним символом новой строки), а s2
— это "10"
.
Вы смотрели, что написано в документации
Byte.ToString()
? Вы проверяли возвращаемое значение((byte) '\n').ToString()
? (Это не то, чего вы ожидаете...)