char + char = int?为什么?

Joh*_*ona 62 .net c#

为什么char在C#中添加两个结果int

例如,当我这样做时:

var pr = 'R' + 'G' + 'B' + 'Y' + 'P';
Run Code Online (Sandbox Code Playgroud)

pr变量变成int类型.我希望它是string一个值为的类型"RGBYP".

为什么C#这样设计?是不是添加两个chars 的默认实现应该导致一个string连接chars,不是int

Dir*_*irk 78

Accoding到炭的文档也可以被隐式转换成整数值.该char类型未定义自定义,operator +因此使用整数.

对于那里是没有隐式转换为字符串的理由从埃里克利珀在他的第一个注释说明以及对博客条目"为什么字符转换隐式USHORT反之则不行?" :

它在v1.0中被考虑过.1999年6月6日的语言设计说明"我们讨论了这种转换是否应该存在,并决定提供第三种方式进行转换是很奇怪的.[该语言]已经支持c.ToString()和new串(C)".

(信贷JimmiTh发现报价)

  • 只是为了添加为什么它被设计成这样的原因 - 特别是为什么没有隐含的转换为字符串(我们是否同意基本原理),Eric Lippert说:'它在v1.0中被考虑过.1999年6月6日的语言设计说明"我们讨论了这种转换是否应该存在,并决定提供第三种方式进行转换是很奇怪的.[该语言]已经支持c.ToString()和new串(C)"." (16认同)
  • http://blogs.msdn.com/b/ericlippert/archive/2009/10/01/why-does-char-convert-implicitly-to-ushort-but-not-vice-versa.aspx - 这是Lippert的回答第一条评论. (7认同)

Kei*_*thS 14

char是一个值类型,意味着它有一个数值(其UTF-16 Unicode序数).但是,它不被视为数字类型(如int,float等),因此,+运算符未定义为char.

char但是,该类型可以隐式转换为数字int类型.因为它是隐式的,所以允许编译器根据C#规范中规定的一组优先规则为您进行转换.int是通常尝试的第一件事.这使+操作员有效,因此执行操作.

要做你想做的事,请从空字符串开始:

var pr = "" + 'R' + 'G' + 'B' + 'Y' + 'P';
Run Code Online (Sandbox Code Playgroud)

与char类型不同,字符串类型为Object定义了一个重载的+运算符,它将第二个术语(无论它是什么)转换为字符串,ToString()然后再连接到第一个术语.这意味着不执行隐式转换; 您的pr变量现在被推断为字符串,并且是所有字符值的串联.


Ted*_*Ted 8

因为单个char可以转换为Unicode值,并且可以很容易地存储为整数,占用的空间比单个字符串少.

  • +1答案很好,但添加更多说明 (3认同)
  • `char`是一个unicode代码点,而不是ASCII字符. (2认同)
  • @Dirk - 我希望我的编辑涵盖你,请在downvoting之前仔细阅读... (2认同)

Ern*_*rno 7

来自MSDN:

Char对象的值是16位数字(序数)值.

char是一种整体类型.它不是一个角色,它是一个数字!

'a' 只是一个数字的简写.

因此,在数字中添加两个字符结果.

看看关于添加字节的这个问题,它虽然是违反直觉的,但却是一样的.


Raw*_*ing 6

规范的另一个相关位,在4.1.5(积分类型)中定义char为整数类型:

对于二元+...运算符,操作数被转换为类型T,其中T是第一的int,uint,longulong一个可以完全表示两个操作数的所有可能值.

所以对于a char,两者都被转换intints 然后添加.


小智 6

关键是,许多C#概念来自C++和C.

在这些语言中的单个字符常量(如"A")被表示为自己的ASCII值,尽管什么可以预计,它的类型不是字符,但INT(是"A"是一个int,一样书写65).

因此,添加所有这些值就像写一系列ascii字符代码,即

   var pr= 82 + 71 + 66 + ...;
Run Code Online (Sandbox Code Playgroud)

这在某种程度上是C/C++的设计决定(它可以追溯到70年代的C).


aia*_*tag 5

来自MSDN:

在许多情况下可能会发生隐式转换,包括方法调用和赋值语句.

char可以隐式转换为ushort,int,uint,long,ulong,float,double或decimal.因此,赋值操作隐式地将char转换为int.

  • 赋值是*not*什么调用隐式转换.在赋值发生时,有一个`int`值等于`int` +运算符的结果. (2认同)