三元运算符;这种语法有啥问题?

Posted

技术标签:

【中文标题】三元运算符;这种语法有啥问题?【英文标题】:Ternary operator; What is wrong with this syntax?三元运算符;这种语法有什么问题? 【发布时间】:2011-07-13 04:35:54 【问题描述】:

我正在尝试创建 MailMessage,但出现以下错误...

Cannot implicitly convert type 'string' to 'bool'

这是我的初始化语句:

MailMessage msg = new MailMessage("DoNotReply@optoma.com",
                      myTbl.Rows[i]["Requester"].ToString().Trim(),
                      subject, 
                      "Dear " + myTbl.Rows[i]["Ship_Attention"].ToString() + ",<br/><br/>" +
                      body + "<br/>Your ISO ID is " + myTbl.Rows[i]["ISO_ID"].ToString() + 
                      (Convert.ToInt32(myTbl.Rows[i]["EmailType"]) == 1) ? 
                          ("<br/>Tracking Number: " + myTbl.Rows[i]["Tracking_No"].ToString()) : 
                          ("") + "<br/><br/>Please examine the loaned items for this transaction:<br/><br/>" +
                      sw.ToString());

我试图在运行时基于布尔表达式添加到字符串。为什么我不能这样做?我做的不对吗?

string + (true | false) ? "somestring" : "anotherstring" + string

【问题讨论】:

离题且略显尖酸刻薄,但只是一个建议……代码可能需要考虑一些主要的可读性。 【参考方案1】:

那个? : 运算符的优先级很低。把它放在括号里,我想你会解决你的问题。

((true|false)?"somestring":"anotherstring")

【讨论】:

哈哈,不错。非常感谢【参考方案2】:

当你有string + (bool)?"somestring":"anotherstring" + string 时,+? 之前被评估,所以你需要括号:

string + ((bool)?"somestring":"anotherstring") + string

【讨论】:

【参考方案3】:

稍微清理一下......你就不会遇到太多运算符优先级问题

  void SendMessage(DataRow  row, string subject, string body, string sw)
    
        var to = row["Requester"].ToString().Trim();
        var isoId = row["ISO_ID"].ToString();
        var attention = row["Ship_Attention"].ToString();
        var emailType = Convert.ToInt32(row["EmailType"]);
        var message = (emailType == 1) ? ("<br/>Tracking Number: " + row["Tracking_No"]) : ("");
        MailMessage msg = new MailMessage("DoNotReply@optoma.com",
                  to,
                  subject, 
                  string.Format("Dear 0,<br/><br/>1<br/>Your ISO ID is 23<br/><br/>Please examine the loaned items for this transaction:<br/><br/>4",
                                attention, body, isoId, message, sw));
    

【讨论】:

【参考方案4】:

优先级不是您所期望的——+ 首先被评估。您的代码应采用以下形式:

string + (true|false ? "somestring" : "anotherstring") + string

对于您的具体示例:

MailMessage msg = new MailMessage("DoNotReply@optoma.com", myTbl.Rows[i]["Requester"].ToString().Trim(),
subject, "Dear " + myTbl.Rows[i]["Ship_Attention"].ToString() + ",<br/><br/>" +
body + "<br/>Your ISO ID is " + myTbl.Rows[i]["ISO_ID"].ToString() + (Convert.ToInt32(myTbl.Rows[i]["EmailType"]) == 1 ? ("<br/>Tracking Number: " + myTbl.Rows[i]["Tracking_No"].ToString()) : ("")) + "<br/><br/>Please examine the loaned items for this transaction:<br/><br/>" +
sw.ToString());

请注意,这是一个很长的表达式,应该将其分解为多个语句,以使其更具可读性和可维护性。

【讨论】:

【参考方案5】:

加法运算符 (+) 的优先级高于条件运算符 (?:),如下所示:http://msdn.microsoft.com/en-us/library/aa691323%28v=vs.71%29.aspx。

因此,您需要在整个条件周围加上括号:

string + ((true|false)?"somestring":"anotherstring") + string

我建议你把你的代码分成多行,引入一些临时变量,并使用 string.format() 让它看起来更清晰。在干净的代码中查找错误要容易得多。

【讨论】:

以上是关于三元运算符;这种语法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用'&&'和'||'有啥区别通过三元运算符('?'和':')?

带有三元运算符的海象运算符的正确语法是啥?

这行三元运算符的语法是啥

Java三元运算符语法[重复]

Javascript三元运算符语法不理解[重复]

我们在 JavaScript 中有更简单的三元运算符吗? [复制]