How does the UTF-16 character turns to Number and otherwise turns to char
我曾经模拟过
1 2 3 4 5 6 | dynamic s = 2; var w =""; var d1 = s +"" +"dynamic test 1"; var d2 = s + 'd' + ' ' +"dynamic test 2"; String d3 = s + 'k' + ' ' +"dynamic test 2"; var d4 = 'd' +"dynamic test 2"; |
简单来说:
我的问题是:
为什么char
从左到右执行。因此,首先添加整数,然后字符类型将字符强制转换为整数,然后将这些字符的输出追加到字符串中。
对于d4,因为在开始处没有整数,所以在追加之前将字符类型转换为字符串。
说明:
感谢科拉克的详细解释。在答案中添加它,这样就不会遗漏。
您有一个int值(2)和一个char值("d")。你想把它们加在一起。预期的结果是什么?"2d"将是一个字符串,因此既不是int也不是char。对大多数人来说,这是出乎意料的,所以这不是好事。还会发生什么?D'可以用2来表示。所以结果可能是"f"。但这只适用于非常少的int值。所以决定,int加char得到int,取char的数值。这几乎适用于int和char的每个组合,所以这就是所选择的行为。
另一方面,您有一个char值("d")和一个字符串值("test")。你想把它们加在一起。预期的结果是什么?像int+char那样获取char的数值将导致"100test",这是非常意外的。另外,object+string(或string+object)的标准行为是隐式地将其转换为object.toString()+string。和"d".ToString()将是"d"(字符串值!).so"d".ToString()+"test"会产生"dtest",这也是预期的行为。所以赢了。^ ^ ^
因为运算符的优先级和所选的
1 | var d2 = s + 'd' + ' ' +"dynamic test 2"; |
对于第一个
Paulf提供了指向文档的链接,其中提到char:
The value of a Char object is a 16-bit numeric (ordinal) value.
这就是为什么结果是一个数字的原因。
对第二个
第三个ocx1〔3〕运算符有一个另一侧的字符串,因此编译器隐式调用
现在可以使用
1 | var d2 = s + ('d' + (' ' +"dynamic test 2")); |
这里,将首先评估第三个
这篇文章可能会提供进一步的帮助
编辑
下面是所有可能的加法运算符重载的概述
一般来说,数据类型的选择是通过以下方式确定的:
For an operation of the form x + y, binary operator overload resolution Section 7.2.4 is applied to select a specific operator implementation. The operands are converted to the parameter types of the selected operator, and the type of the result is the return type of the operator.
文档中的字符串连接状态为:
When one or both operands are of type string, the predefined addition operators concatenate the string representation of the operands.
The binary + operator performs string concatenation when one or both operands are of type string.
为了避免这样的错误(加上整数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | dynamic s = 2; var w =""; var d1 = $"{s} dynamic test 1"; // s followed by space and dynamic test 1 // I've preserved 'd' and 'k' to show absence of the errors // More natural code is // var d2 = $"{s} d dynamic test 2"; var d2 = $"{s} {'d'} dynamic test 2"; // s followed by space then 'd' character ... String d3 = $"{s}{'k'} dynamic test 2"; var d4 = $"{'d'} dynamic test 2"; ... |
编辑:如果C 5.0-不支持字符串插值,请尝试使用格式:
1 2 3 4 5 | var d1 = string.Format("{0} dynamic test 1", s); var d2 = string.Format("{0} {1} dynamic test 2", s, 'd'); String d3 = string.Format("{0}{1} dynamic test 2", s, 'k'); var d4 = string.Format"{0} dynamic test 2", 'd'); |
不连接字符串:
如果我是对的,就像ASCII一样,每个字母对应一个数字