var输出= 1 + 2 + 3 +“ 4” + 5 +“ 90”; 输出:64590 ;; 只想知道为什么?

Pra*_*mil -3 c#

需要知道所述输出背后的逻辑原因

var output = 1 + 2 + 3 + "4" + 5 + "90";
Run Code Online (Sandbox Code Playgroud)

输出:“ 64590”

Dav*_*vid 7

因为表达式是从左到右求值的,所以该表达式中的所有运算符都具有相同的优先级。所以让我们一次带他们一个...

1 + 2 = 3
3 + 3 = 6
6 + "4" = "64"
"64" + 5 = "645"
"645" + "90" = "64590"
Run Code Online (Sandbox Code Playgroud)
  • +对两个整数使用时,结果是一个整数,将两个数相加
  • +在两个字符串上使用时,结果是一个字符串,将两个字符串串联在一起
  • 当您+在字符串和整数(或其他任何东西,我怀疑)上使用时,结果是字符串,将整数隐式转换为字符串(可能是通过.ToString()在已编译的代码中调用它),然后将两者串联

每当多部分表达式的结果出乎意料时,好的调试步骤是将其拆分为单独的操作,并将结果存储在可观察的变量中。然后在调试器中逐步执行每个操作,并观察每个操作的结果。如果特定操作产生了意外结果,则下一步是确定期望的结果以及原因


Adr*_*ian 5

+运营商有几个重载。与您的代码段相关的是

// Integer addition
int operator +(int x, int y); // A

// String concatenation
string operator +(string x, string y); // B
string operator +(string x, object y); // C
string operator +(object x, string y); // D
Run Code Online (Sandbox Code Playgroud)

对于情况C和B,请注意C#6.0规范的相关部分(第7.8.4节加法运算符)

这些二进制+运算符的重载执行字符串连接。如果字符串连接的操作数为null,则替换为空字符串。否则,通过调用从类型对象继承的虚拟ToString方法,将任何非字符串参数转换为其字符串表示形式。如果ToString返回null,则替换为空字符串。

因此,你的表情

var output = 1 + 2 + 3 + "4" + 5 + "90";
Run Code Online (Sandbox Code Playgroud)

使用以下运算符从左到右求值:

var output = ((((1 + 2) + 3) + "4") + 5) + "90";
                 --A--
                 -----A-----
                 ---------D--------
                 ------------C----------
                 ------------------B-----------  
Run Code Online (Sandbox Code Playgroud)