三元运算符;这个语法有什么问题?

时间:2011-03-11 01:45:43

标签: c# asp.net syntax ternary-operator

我正在尝试创建一个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

5 个答案:

答案 0 :(得分:13)

? :运算符的优先级非常低。把它放在括号中,我想你会解决你的问题。

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

答案 1 :(得分:3)

如果string + (bool)?"somestring":"anotherstring" + string + ?之前评估string + ((bool)?"somestring":"anotherstring") + string,那么您需要括号:

{{1}}

答案 2 :(得分:2)

只需清理一下......你就不会遇到运算符优先级问题了

  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 {2}{3}<br/><br/>Please examine the loaned items for this transaction:<br/><br/>{4}",
                                attention, body, isoId, message, sw));
    }

答案 3 :(得分:0)

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

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());

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

答案 4 :(得分:0)

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

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

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

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