C# char+;char=int?为什么?

C# char+;char=int?为什么?,c#,.net,C#,.net,为什么在C#结果中向int类型添加两个char 例如,当我这样做时: var pr = 'R' + 'G' + 'B' + 'Y' + 'P'; pr变量变为int类型。我希望它是一个字符串类型,值为“RGBYP” 为什么C#设计成这样?添加两个chars的默认实现是否应该产生一个连接chars的string,不是int?因为单个字符可以转换为Unicode值,并且可以轻松地存储为整数,占用的空间比单个字符串少。因此可以隐式转换为整数值。char类型没有定义自定义的运算符+,因此使用整数类型

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

例如,当我这样做时:

var pr = 'R' + 'G' + 'B' + 'Y' + 'P';
pr
变量变为
int
类型。我希望它是一个
字符串
类型,值为
“RGBYP”


为什么C#设计成这样?添加两个
char
s的默认实现是否应该产生一个连接
char
s的
string
,不是
int

因为单个字符可以转换为Unicode值,并且可以轻松地存储为整数,占用的空间比单个字符串少。

因此可以隐式转换为整数值。
char
类型没有定义自定义的
运算符+
,因此使用整数类型

Eric Lippert在其著作中的第一条评论很好地解释了不存在到字符串的隐式转换的基本原理:

在v1.0中考虑了它。6月6日的语言设计笔记 1999年,他说:“我们讨论了这种转换是否应该存在,以及 决定提供第三种方法来实现这一点是很奇怪的 转换。[该语言]已经支持c.ToString()和new 字符串(c)”


(这要归功于)

不应该这样做,因为这样做效率低下。如果要像这样连接字符,应该使用字符串生成器。否则,每次添加都会创建一个临时内存来保存相关的部分字符串,这意味着在您的示例中,必须进行4次临时内存分配。

字符是16位整数值的文本表示形式。您只是简单地将int添加到一起。如果要连接字符,必须将它们转换为字符串。

:

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

字符是一种整数类型。它不是一个字符,而是一个数字

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

因此,添加两个字符将产生一个数字

来自:

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


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

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

对于二进制
+
。。。运算符,操作数转换为类型
T
,其中
T
int
uint
long
ulong
中的第一个,可以完全代表两个操作数的所有可能值


因此,对于
char
,两者都转换为
int
,然后作为
int
s添加。

如前所述,这是因为char的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';
将每一个都转换为一个字符串(或者第一个也可以):

为什么C#设计成这样?不是的默认实现吗 添加两个字符将产生一个字符串,该字符串将 字符,不是int

就你想要完成的事情而言,你的意图是不正确的。 字符串不是字符的加法,字符串是所谓的“singleton”字符串的加法

所以“a”+“b”=>“ab”,如果考虑到字符串的+运算符重载,这是绝对正确的。
因此‘a’代表ASCII字符65,可以完全一致地说,‘a’+‘b’是131

A
char
System.char
是一种完整类型:

一种整数类型,表示值介于0和65535之间的无符号16位整数。类型的可能值集对应于Unicode字符集

这意味着它的行为完全类似于
uint16
系统。uint16
,因此使用
+
运算符添加字符会添加整数值,因为
+
运算符在
字符中没有重载

将单个字符链接为字符串使用<代码> StringBuilder。追加(char)< /COD>或<代码>新字符串(CHAR[])< /> > < /P> < P>,点是C概念来自C++和C.

在这些语言中,单个字符常量(如“a”)表示为Ascii值,尽管人们可能会想到,它的类型不是char,而是int(是的,“a”是int,与写65相同)

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

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

<>这是C/C++在某个时候的一个设计决定(用C返回到70)。p> 因为一个字符加上另一个字符可以超过一个字符变量允许的最大值,这就是为什么该操作的结果被转换为一个int变量。

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

但是,
char
类型可以隐式转换为numeric
int
类型。因为它是隐式的,编译器可以根据C#spec中列出的一组优先规则为您进行转换。
int
是通常首先尝试的事情之一。这使得
+
运算符有效,因此执行的操作就是这样

要执行所需操作,请从空字符串开始:

var pr = "" + 'R' + 'G' + 'B' + 'Y' + 'P';
与char类型不同,string类型为Object定义了一个重载+运算符,它使用
ToString()将第二个术语(不管它是什么)转换为字符串
var pr = "" + 'R' + 'G' + 'B' + 'Y' + 'P';
A char can be implicitly converted to a numeric type.
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());