为什么这不能用C#编译?

sup*_*cal 5 .net c#

为什么这样做:

if ("xx".StartsWith("x"))
{

}
Run Code Online (Sandbox Code Playgroud)

但这不是:

if ("xx" + "xx".StartsWith("x"))
{

}
Run Code Online (Sandbox Code Playgroud)

编译器说错误CS0029:无法将类型'string'隐式转换为'bool'

Cod*_*aos 25

成员访问运算符的.优先级高于+运算符.

检查C#运算符(MSDN)以获取C#运算符优先级.特别是它x.y列为"主要",其高于+"添加剂"中的二进制.

这意味着"xx" + "xx".StartsWith("x")被解释为
"xx" + ("xx".StartsWith("x"))并且不能编译.它汇集a string和a bool给你一个string.但是你不能stringif语句中使用a 作为条件,因为它不是bool(并且也没有实现true运算符)

看起来您希望它被解释为("xx" + "xx").StartsWith("x"))您首先连接字符串然后调用StartsWith组合字符串.


Ant*_*zer 18

因为在第二种情况下,您尝试编译此类代码:

 if ("xx" + true)
 {
 }
Run Code Online (Sandbox Code Playgroud)

  • 这是真的:`if("xx"+ true.ToString())` (3认同)

Kyl*_*man 16

将它包裹在Parens中

if (("xx" + "xx").StartsWith("x"))
{

}
Run Code Online (Sandbox Code Playgroud)

错误的原因是string加a bool= a string,if语句期望a bool.


Bob*_*bby 5

因为编译器是第一个评价函数调用,因此他会尽力来连接"xx"true:

if("xx" + "xx".StartsWith("x")) {
// becomes
if("xx" + true) {
Run Code Online (Sandbox Code Playgroud)

在运行时期间无法进行此隐式转换.您需要告诉编译器首先连接字符串:

if(("xx" + "xx").StartsWith("x")) {
Run Code Online (Sandbox Code Playgroud)


小智 5

它与运营商的优先权有关.在你的情况下,StartsWith返回bool,当与字符串相加时,字符串+ bool不返回bool,它返回一个字符串,而if()期望一个bool.

您可以使用括号更改操作的优先级.