繁体   English   中英

为什么C#没有为char定义加法运算?

[英]Why does C# not define an addition operation for char's?

如标题所示。 与这个问题有关。

为什么以下代码不起作用? 从逻辑上讲,这似乎是合理的。

string foo = 'a' + 'b'; // Fails with an invalid int -> string conversion

现在,从上述链接的问题中,我们可以推断出发生了什么:编译器正在使用隐式char-> int转换,然后添加这些值。 这使我相信,一定不能为char定义加法运算! 这是真的吗?如果是这样,为什么没有呢?

编辑:普遍的共识是,没有太多的定义,而我希望没有定义的定义太多。

首先,谈谈您的演绎过程。 您的推论-即char转换为int,因此char上没有定义加法运算符-很容易理解,对您来说很好。 但是我注意到,扣除过程是不必要的。 您可能只需要阅读规范的7.7.4节,即可清楚地描述所有内置的加法运算符。 简而言之,它们是int + int,uint + uint,long + long,ulong + ulong,float + float,double + double,decimal + decimal,枚举和基础类型,委托组合,string + string,string + object和对象+字符串。 (当然,涉及值类型的那些类型的提升为可空版本。)是的,没有使用char的加法运算符。

其次,回答您的“为什么不?” -字符有点奇怪。 它们的存储是短整数,但是它们的语义是字符串中字符的语义。 那么应将char视为其整数形式还是一个短字符串? 在这种情况下,语言设计人员决定遵循诸如C之类的早期语言,在对不涉及字符串的数学运算时将char视为整数。 如果要将它们像短字符串一样对待,可以使用多种方法将字符转换为字符串。 另一个答案表明,在空字符串后面附加一个明确的内容告诉编译器“此操作是在字符串上,而不是在字符的整数值上”。

您真正要寻找的是:

string foo = String.Concat('a', 'b');

无论如何,编译器对字符串使用'+'运算符。

这大约是任何String.Format操作的两倍。

我想一个人应该关注您问题中的“为什么”一词。 在C#中,添加两个字符的行为已定义为表示“添加Unicode值”而不是“连接”。 我们一致认为,考虑到字符串和字符与整数相比,它们比前一辈子(例如,C编程语言)具有更大的区别性,因此可以更合理地将其定义为“连接”。

“ a”是字符常量。 传统上,至少在C语言中,字符常量只是表示整数的另一种方式。 在这种情况下,所述整数的Unicode值(“ a” = 97,“ b” = 98,依此类推)。 因此,表达式“ a” +“ b”用来表示将这两个Unicode值相加。

要实现您的期望,请执行

String foo = "a" + "b";  // double quotes = single-character strings to concatenate

正如已经说过的,char被认为是整数而不是字符串的形式,因此从根本上说,加法运算是将两个数字相加,而不是执行串联。 您可以将两个字符放入字符串中,如下所示:

string str = String.Format("{0}{1}", 'a', 'b');

为了使字符“累加”,您可以做一些与您的原始意图类似的事情:

string foo2 = 'a' + "" + 'b'; //  Succeeds
string foo3 = 'a'.ToString() + 'b'.ToString(); // Succeeds
string foo4 = string.Concat('a', 'b'); // Succeeds

对于foo2示例,您可以通过插入空字符串为编译器提供线索,并分别为每个char强制将隐式char转换为字符串。

对于foo3示例,您在每个字符上使用ToString调用以允许添加两个字符串。

您可以对字符串使用加法运算符的重载,然后尝试以下操作:

var result = "" + 'a' + 'b';

但请不要与

var result = 'a' + 'b' + "";  // BAD !!!!!

因为它将给您int转换为字符串并等于“ 195”。

这个想法是让运算符+重载以插入字符串,并且您应该将第一个参数作为字符串来实现。

看起来有点像作弊,但这就是C#-毫无意义和残酷! (实际上是.Net,它没有运算符+(Char,Char)和C#试图将Char强制转换为Int32的重载)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM