2011-03-11 289 views
3

我试图创建一个MAILMESSAGE,而且我发现了以下错误......三元运算符;这个语法有什么问题?

Cannot implicitly convert type 'string' to 'bool' 

这是我的初始化语句:

MailMessage msg = new MailMessage("[email protected]", 
         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 
+4

题外话稍微表露无疑,但只是一个建议......这些代码可以使用一些主要的可读性考虑。 – jaywon 2011-03-11 01:52:18

回答

13

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

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

哈哈,很好。非常感谢你 – 2011-03-11 01:52:19

3

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

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

0

的优先级是不是你所期望的 - +被首先计算。你的代码应该是形式:

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

为您具体的例子:

MailMessage msg = new MailMessage("[email protected]", 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()); 

注意,这是一个很长的表达,或许应该被分解成几个语句,使其更具可读性和维护。

0

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

因此,你需要把括号围绕整个条件:

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

我建议你到你的代码分成多行,介绍一些临时变量和使用的String.Format(),使它看起来clener。在干净的代码中查找错误要容易得多。

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("[email protected]", 
        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)); 
    } 
+0

+1这真的是正确的解决方案恕我直言 – jaywon 2011-03-12 01:00:23