关于c#:UTF-16字符如何变为Number,否则变为char

How does the UTF-16 character turns to Number and otherwise turns to char

我曾经模拟过VAR VS Dynamic变量,后来我想到了:

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";

简单来说:

enter image description here

我的问题是:

为什么char dk变成一个数字,而d4变量中的d保持其自身的值,即d


从左到右执行。因此,首先添加整数,然后字符类型将字符强制转换为整数,然后将这些字符的输出追加到字符串中。

对于d4,因为在开始处没有整数,所以在追加之前将字符类型转换为字符串。

说明:

the integer value of 'd' is 100

the value of ' ' is 32

Hence 2 + 100 + 32 = 134.谢谢保罗的建议

感谢科拉克的详细解释。在答案中添加它,这样就不会遗漏。

您有一个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";

对于第一个+操作符,两侧有一个int和一个char。这里选择了加法运算符的重载int operator +(int x, int y);,它将添加数字和字符(它隐式转换为int,因为在窗帘后面它有'd'的数字表示)。结果你得到了一个int

Paulf提供了指向文档的链接,其中提到char:

The value of a Char object is a 16-bit numeric (ordinal) value.

这就是为什么结果是一个数字的原因。

对第二个+操作符进行同样的处理。

第三个ocx1〔3〕运算符有一个另一侧的字符串,因此编译器隐式调用int变量上的ToString方法,并选择另一个加法运算符重载,即:string operator +(object x, string y);将两者连接起来。

现在可以使用( )确定优先级。在这一行中:

1
var d2 = s + ('d' + (' ' +"dynamic test 2"));

这里,将首先评估第三个+运算符,因此将采用串联重载。结果是一个字符串。第二个运算符将在右侧再次遇到一个字符串,因此它将再次处于相同的上下文中,并再次调用ToString()方法,并将char连接起来(转换为字符串)。当再次到达第一个运算符时,将调用ToString()方法(现在在int上,转换为字符串)。

这篇文章可能会提供进一步的帮助

编辑

下面是所有可能的加法运算符重载的概述

一般来说,数据类型的选择是通过以下方式确定的:

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.


为了避免这样的错误(加上整数s和字符d而导致s + (int) 'd'的错误),使用字符串插值(或格式化):

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一样,每个字母对应一个数字