Accoding к документация символа это может быть неявно преобразовано в целочисленные значения. Эти char
тип не определяет пользовательское operator +
, таким образом, тот для целых чисел используется.
объяснение для того, чтобы там не быть никаким неявным преобразованием в строку объяснено хорошо в первом комментарии от Eric Lippert в его запись в блоге на, "Почему делает символьное преобразование неявно в ushort, но не наоборот?" :
Это рассмотрели в v1.0. В примечаниях дизайна языка с 6-го июня 1999 говорится, что "Мы обсудили, должно ли такое преобразование существовать и решило, что будет нечетно для обеспечения третьего способа сделать это преобразование. [Язык] уже поддерживает обоих c. ToString () и новая Строка (c)".
(кредит к JimmiTh для открытие та кавычка )
Вы предполагаете, что char
строковый тип. Значение char
может быть , представил символьным значением между одинарными кавычками, но если оно помогает, необходимо полагать что быть абстракцией, чтобы обеспечить удобочитаемость, вместо того, чтобы вынудить Вас как разработчика запомнить базовое значение. Это - на самом деле, тип числового значения, таким образом, Вы не должны ожидать, что любые функции обработки строк будут применимы.
, относительно почему, почему char + char = int
?Понятия не имею. Конечно, обеспечение неявного преобразования в Int32
смягчило бы арифметические переполнения, но затем почему short + short
неявно не вводится к int
?
Поскольку символ плюс другой символ может превысить максимальное значение, разрешенное для символьной переменной, вот почему результат той операции преобразовывается в международную переменную.
, Почему C# разработан как это? Разве реализация по умолчанию добавления двух символов не была, должен заканчиваться к строке, которая связывает символы, не интервал?
то, Что Вы предназначили, не корректно относительно того, что Вы хотите выполнить. Строка не является добавлением символов, Строка является добавлением так для высказывания "одноэлементных" строк.
Так "a" + "b" => "ab", который абсолютно корректен, если Вы принимаете во внимание, что + оператор для строк перегружается. И следовательно представление символа ASCII 65, это полностью последовательно, чтобы сказать, что + 'b' равняется 131.
1) Определение (MSDN):
символьное ключевое слово используется для объявления 16-разрядного символа, используемого для представления большинства известных письменных языков через мир.
<час>2), Почему символу действительно нравятся числовые типы?
A char can be implicitly converted to a numeric type.
символ А ближе к целому числу, чем к строке. Строка является только набором символьных объектов, тогда как целое число может представить символ и наоборот.
<час>3) Примеры
можно просто преобразовать первый из символов к строке, для обмана компилятора:
var pr = 'R'.ToString() + 'G' + 'B' + 'Y' + 'P';
Вы могли также определить массив символов и затем использовать строкового конструктора:
char[] letters = { 'R', 'G', 'B','Y', 'P' };
string alphabet = new string(letters);
, Если Вы хотите распечатать символ только, всегда необходимо преобразовывать его в строку, для получения ее текстового представления:
var foo1 = 'F';
MessageBox.Show(foo1.ToString());
Как был сказан, это - потому что символ имеет значение Int32, содержащее его значение unicode.
, Если Вы хотите связать символы в строку, можно выполнить одно из следующих действий:
Передача массив символов к новой строке:
var pr = new string(new char[] { 'R', 'G', 'B', 'Y', 'P' });
Использование StringBuilder:
StringBuilder sb = new StringBuilder();
sb.Append('R');
etc...
Начинаются со строкой:
var pr = string.Empty + 'R' + 'G' + 'B' + 'Y' + 'P';
Бросок каждый к строке (или просто 1-й будет работать точно также):
var pr = (string)'R' + (string)'G' + (string)'B' + (string)'Y' + (string)'P';
От MSDN:
Неявные преобразования могли бы произойти во многих ситуациях, включая вызов метода и операторы присваивания.
символ А может быть неявно преобразован в ushort, интервал, uint, долго, ulong, плавание или десятичное число. Таким образом та операция присвоения неявно преобразовывает символ в интервал
Точка, что много понятий C# прибывают из C++ и C.
На этих языках постоянный отдельный символ (как) представлен как их значение ASCII, и несмотря на то, что можно ожидать, это - тип, не символ, но интервал (да интервала, то же как запись 65).
Таким образом, добавление всех этих значений похоже на запись ряда кодов символов ASCII, т.е.
var pr= 82 + 71 + 66 + ...;
Это было проектным решением в C / C++ в какой-то момент (его возвращение к 70-м с C).
Другой соответствующий бит спецификации, в разделе 4.1.5 (Целочисленные типы), определявшие char
как целочисленный тип:
Для двоичного файла
+
... операторы, операнды преобразовываются в типT
, гдеT
является первым изint
,uint
,long
иulong
, который может полностью представить все возможные значения обоих операндов.
Так для char
, оба преобразовываются в int
и затем добавляются как [1 110] с.
значение Символьного объекта является 16-разрядным числовым (порядковым) значением.
символ А является целочисленным типом. Это не символ, это - число!
'a'
просто сокращение от числа.
Настолько добавляющие два символа приводят к числу.
Взглянули на этот вопрос о добавляющих байтах, это - хотя парадоксальный, то же самое.
Поскольку единственный символ может быть преобразован в значение Unicode и может быть легко сохранен как целое число, занимающее меньше места, чем односимвольная строка.
char
тип значения, означая, что он имеет численное значение (его порядковый Unicode UTF-16). Однако это не считают числовым типом (как интервал, плавание, и т.д.) и поэтому, +, оператор не определяется для символа.
Эти char
тип может, однако, быть неявно преобразован в числовое int
тип. Поскольку это неявно, компилятору позволяют сделать преобразование для Вас, согласно ряду правил приоритета размеченным в спецификации C#. int
одна из первых вещей, которые обычно попробовали. Это делает +
оператор допустимый, и таким образом, это - выполненная операция.
, Чтобы сделать, что Вы хотите, запустите с пустой строки:
var pr = "" + 'R' + 'G' + 'B' + 'Y' + 'P';
В отличие от символьного типа, строковый тип определяет перегруженное + оператор для Объекта, который преобразовывает второй срок, независимо от того, что это в строку с помощью ToString()
прежде, чем связать его к первому сроку. Это означает, что никакой неявный кастинг не выполняется; Ваш pr
переменная теперь выведена как строка и является конкатенацией всех символьных значений.
char
или System.Char
целочисленный тип:
целочисленный тип, представляющий неподписанные 16-разрядные целые числа со значениями между 0 и 65535. Множество возможных значений для типа соответствует набору символов Unicode.
Это означает, что ведет себя точно как uint16
или System.UInt16
, и добавляющие символы с +
, оператор поэтому добавляет интегральные значения, потому что +
оператор не перегружается в char
.
Для конкатенации отдельных символов в строковое использование StringBuilder.Append(char)
или new String(char[])
.
Символ является текстовым представлением 16-разрядного целочисленного значения. Вы просто добавляете ints вместе. Если Вы хотите связать символы, необходимо будет бросить их к строкам.
Это не было должно, потому что это будет неэффективно. Если бы один хотел связать символы как этот, то они должны использовать строкового разработчика. Иначе каждое дополнение создало бы временную память для содержания связанной частичной строки, которая будет означать, что в примере 4 выделения временной памяти должны были бы произойти.