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

时间:2011-05-05 15:28:25

标签: c# .net

为什么这样做:

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

}

但这不是:

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

}

编译器说错误CS0029:不能隐式地将类型'string'转换为'bool'

12 个答案:

答案 0 :(得分:25)

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

检查C# Operators (MSDN)以获取C#运算符优先级。特别是它将x.y列为“primary”,高于“additive”中的二进制+

这意味着"xx" + "xx".StartsWith("x")被解释为
"xx" + ("xx".StartsWith("x"))并且无法编译。它汇总stringbool,为您提供string。但是,您不能在string语句中使用if作为条件,因为它不是bool(并且也没有实现true运算符)

您似乎希望将其解释为("xx" + "xx").StartsWith("x")),首先将字符串连接起来,然后在组合字符串上调用StartsWith

答案 1 :(得分:18)

因为在第二种情况下你试图编译这样的代码:

 if ("xx" + true)
 {
 }

答案 2 :(得分:16)

用Parens包裹它

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

}

错误的原因是string加上bool = a string,if语句需要bool

答案 3 :(得分:5)

因为编译器首先评估函数调用,所以他会尝试将"xx"true连接起来:

if("xx" + "xx".StartsWith("x")) {
// becomes
if("xx" + true) {

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

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

答案 4 :(得分:5)

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

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

答案 5 :(得分:2)

"xx".StartsWith("x")返回一个布尔值,但"xx" + "xx".StartsWith("x")返回一个“xxTrue”或“xxFalse”的字符串。

答案 6 :(得分:2)

因为在if语句中,逻辑表达式不是字符串。

答案 7 :(得分:2)

"xx".StartsWith("x")

正在返回bool,当您尝试向其添加“xx”时,它会将其转换为string

将您的代码更改为

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

}

答案 8 :(得分:2)

if()需要一个表达式不是的布尔值。 这与C / C ++相反,C / C ++期望将int值作为条件。

答案 9 :(得分:0)

“xx”+“xx”.StartsWith(“x”)不是布尔表达式。它评估为“xxTrue”。

答案 10 :(得分:0)

连接运算符(+)在第二个示例中对字符串进行隐式强制转换。该示例还检查是否设置了一个字符串,如果它是以某个东西开头的话。

答案 11 :(得分:0)

原因是String.StartsWith()方法返回一个布尔值(ref)。所以你将+运算符应用于字符串和布尔值,这是行不通的。如果要连接字符串,请在新创建的字符串上调用String.StartsWith();添加一些括号:

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

}

希望这有帮助