为什么这样做:
if ("xx".StartsWith("x"))
{
}
但这不是:
if ("xx" + "xx".StartsWith("x"))
{
}
编译器说错误CS0029:不能隐式地将类型'string'转换为'bool'
答案 0 :(得分:25)
成员访问运算符.
的优先级高于+
运算符。
检查C# Operators (MSDN)以获取C#运算符优先级。特别是它将x.y
列为“primary”,高于“additive”中的二进制+
。
这意味着"xx" + "xx".StartsWith("x")
被解释为
"xx" + ("xx".StartsWith("x"))
并且无法编译。它汇总string
和bool
,为您提供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"))
{
}
希望这有帮助