символ + символ = интервал? Почему? [дубликат]

62
задан 31 May 2013 в 11:18

15 ответов

Accoding к документация символа это может быть неявно преобразовано в целочисленные значения. Эти char тип не определяет пользовательское operator +, таким образом, тот для целых чисел используется.

объяснение для того, чтобы там не быть никаким неявным преобразованием в строку объяснено хорошо в первом комментарии от Eric Lippert в его запись в блоге на, "Почему делает символьное преобразование неявно в ushort, но не наоборот?" :

Это рассмотрели в v1.0. В примечаниях дизайна языка с 6-го июня 1999 говорится, что "Мы обсудили, должно ли такое преобразование существовать и решило, что будет нечетно для обеспечения третьего способа сделать это преобразование. [Язык] уже поддерживает обоих c. ToString () и новая Строка (c)".

(кредит к JimmiTh для открытие та кавычка )

78
ответ дан 31 October 2019 в 13:39

Вы предполагаете, что char строковый тип. Значение char может быть , представил символьным значением между одинарными кавычками, но если оно помогает, необходимо полагать что быть абстракцией, чтобы обеспечить удобочитаемость, вместо того, чтобы вынудить Вас как разработчика запомнить базовое значение. Это - на самом деле, тип числового значения, таким образом, Вы не должны ожидать, что любые функции обработки строк будут применимы.

, относительно почему, почему char + char = int?Понятия не имею. Конечно, обеспечение неявного преобразования в Int32 смягчило бы арифметические переполнения, но затем почему short + short неявно не вводится к int?

0
ответ дан 31 October 2019 в 13:39

Поскольку символ плюс другой символ может превысить максимальное значение, разрешенное для символьной переменной, вот почему результат той операции преобразовывается в международную переменную.

0
ответ дан 31 October 2019 в 13:39

, Почему C# разработан как это? Разве реализация по умолчанию добавления двух символов не была, должен заканчиваться к строке, которая связывает символы, не интервал?

то, Что Вы предназначили, не корректно относительно того, что Вы хотите выполнить. Строка не является добавлением символов, Строка является добавлением так для высказывания "одноэлементных" строк.

Так "a" + "b" => "ab", который абсолютно корректен, если Вы принимаете во внимание, что + оператор для строк перегружается. И следовательно представление символа ASCII 65, это полностью последовательно, чтобы сказать, что + 'b' равняется 131.

0
ответ дан 31 October 2019 в 13:39

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());
1
ответ дан 31 October 2019 в 13:39

Как был сказан, это - потому что символ имеет значение 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';
4
ответ дан 31 October 2019 в 13:39

От MSDN:

Неявные преобразования могли бы произойти во многих ситуациях, включая вызов метода и операторы присваивания.

символ А может быть неявно преобразован в ushort, интервал, uint, долго, ulong, плавание или десятичное число. Таким образом та операция присвоения неявно преобразовывает символ в интервал

5
ответ дан 31 October 2019 в 13:39

Точка, что много понятий C# прибывают из C++ и C.

На этих языках постоянный отдельный символ (как) представлен как их значение ASCII, и несмотря на то, что можно ожидать, это - тип, не символ, но интервал (да интервала, то же как запись 65).

Таким образом, добавление всех этих значений похоже на запись ряда кодов символов ASCII, т.е.

   var pr= 82 + 71 + 66 + ...;

Это было проектным решением в C / C++ в какой-то момент (его возвращение к 70-м с C).

6
ответ дан 31 October 2019 в 13:39

Другой соответствующий бит спецификации, в разделе 4.1.5 (Целочисленные типы), определявшие char как целочисленный тип:

Для двоичного файла +... операторы, операнды преобразовываются в тип T, где T является первым из int, uint, long и ulong, который может полностью представить все возможные значения обоих операндов.

Так для char, оба преобразовываются в int и затем добавляются как [1 110] с.

6
ответ дан 31 October 2019 в 13:39

От MSDN:

значение Символьного объекта является 16-разрядным числовым (порядковым) значением.

символ А является целочисленным типом. Это не символ, это - число!

'a' просто сокращение от числа.

Настолько добавляющие два символа приводят к числу.

Взглянули на этот вопрос о добавляющих байтах, это - хотя парадоксальный, то же самое.

7
ответ дан 31 October 2019 в 13:39

Поскольку единственный символ может быть преобразован в значение Unicode и может быть легко сохранен как целое число, занимающее меньше места, чем односимвольная строка.

8
ответ дан 31 October 2019 в 13:39

char тип значения, означая, что он имеет численное значение (его порядковый Unicode UTF-16). Однако это не считают числовым типом (как интервал, плавание, и т.д.) и поэтому, +, оператор не определяется для символа.

Эти char тип может, однако, быть неявно преобразован в числовое int тип. Поскольку это неявно, компилятору позволяют сделать преобразование для Вас, согласно ряду правил приоритета размеченным в спецификации C#. int одна из первых вещей, которые обычно попробовали. Это делает + оператор допустимый, и таким образом, это - выполненная операция.

, Чтобы сделать, что Вы хотите, запустите с пустой строки:

var pr = "" + 'R' + 'G' + 'B' + 'Y' + 'P';

В отличие от символьного типа, строковый тип определяет перегруженное + оператор для Объекта, который преобразовывает второй срок, независимо от того, что это в строку с помощью ToString() прежде, чем связать его к первому сроку. Это означает, что никакой неявный кастинг не выполняется; Ваш pr переменная теперь выведена как строка и является конкатенацией всех символьных значений.

14
ответ дан 31 October 2019 в 13:39

char или System.Char целочисленный тип:

целочисленный тип, представляющий неподписанные 16-разрядные целые числа со значениями между 0 и 65535. Множество возможных значений для типа соответствует набору символов Unicode.

Это означает, что ведет себя точно как uint16 или System.UInt16, и добавляющие символы с +, оператор поэтому добавляет интегральные значения, потому что + оператор не перегружается в char.

Для конкатенации отдельных символов в строковое использование StringBuilder.Append(char) или new String(char[]).

4
ответ дан 31 October 2019 в 13:39

Символ является текстовым представлением 16-разрядного целочисленного значения. Вы просто добавляете ints вместе. Если Вы хотите связать символы, необходимо будет бросить их к строкам.

2
ответ дан 31 October 2019 в 13:39

Это не было должно, потому что это будет неэффективно. Если бы один хотел связать символы как этот, то они должны использовать строкового разработчика. Иначе каждое дополнение создало бы временную память для содержания связанной частичной строки, которая будет означать, что в примере 4 выделения временной памяти должны были бы произойти.

3
ответ дан 31 October 2019 в 13:39

Другие вопросы по тегам:

Похожие вопросы: