在C#中为什么(char)(1) + (char)(2)的结果是整数3?

9
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在尝试将一些VB.NET代码转换为C#,并发现了这个有趣的事情。 在VB.NET和C#中添加两个字符会返回不同的结果。

VB.NET - 返回字符串

Chr(1) & Chr(2) = "  "

C# - 返回 int

(char)(1) + char(2) = 3

如何在C#中添加(连接)两个字符?


你的意思是拼接吗? - paparazzo
如果我错了,请纠正我 - C# 和 Java 中 char 和 int 数组大小相同 & 0001 + 0010 = 0011(3)。 - Srinath Ganesh
@Blam - 是的,连接字符串。 - SarkarG
2
"" + (char)1 + (char)2?不太好看,但应该能用。另外:string.Concat((char)1, (char)2) - Corak
4个回答

15
在C#中,char是一个16位的数值类型,因此+表示加法,而不是连接。因此,当你添加ab时,你会得到a+b。此外,这种加法的结果是一个int (参见快速演示)。
如果你的意思是“将两个字符拼接在一起”,那么在应用运算符+之前,将它们转换为字符串是一个选择。另一个选项是使用string.Format,像这样:
string res = string.Format("{0}{1}", charA, charB);

+1 很遗憾,您跳过了最有趣的部分...为什么在C#中许多操作会向上转型为int :-) - xanatos
好的,你仍然需要回答这个问题 :P - Lews Therin
啊哈...现在我明白了。 尝试了这里提到的所有答案,string.Format似乎是最简洁的方法。 此外,xanatos和Corak的答案也不错,但将来可能会让团队感到困惑。 - SarkarG
3
答案可以简化为 string res = string.Concat(charA, charB); - Jeow Li Huan
@JeowLiHuan 你是对的,string.Concat() 总是比 stringBuilder 和 string.Format() 的性能更好。 - Tony Wu

5
通过将一个空字符串添加到字符变量中,你可以强制将 char 转换为 string… 因此
string res = "" + (char)65 + (char)66; // AB

(从技术上讲,它不是一种转换。编译器知道当您添加到 string 时需要做一些魔术...如果您尝试向字符串添加 null,则将 null 视为空字符串;如果您尝试添加一个 string ,它会执行 string.Concat;如果您尝试添加其他任何东西,则对非字符串成员执行 .ToString(),然后执行 string.Concat)。


3

最佳答案在评论中,因此我想将其提升为正式答案。完全归功于@Jeow Li Huan:

string res = string.Concat(charA, charB);

0

(char)(1) 的 ASCII 值为 1,而 (char)(2) 的 ASCII 值为 2。

因此,1 + 2 的 ASCII 值(即 (char)1 + (char)2)将等于 3。

如果你执行以下操作: "2" + "1",这将给你 "21"(虽然你不应该使用它来连接字符串,这是不好的做法)

如果你执行以下操作: '2' + '1',这将给你整数值 99,即 ASCII 值为 2(即 50)+ ASCII 值为 1(即 49)。


为什么这是一种不好的做法? - Arijoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接