Троичный оператор; Что не так с этим синтаксисом? - PullRequest
3 голосов
/ 11 марта 2011

Я пытаюсь создать 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 ]

13 голосов
/ 11 марта 2011

? : оператор имеет очень низкий приоритет. Поместите это в скобки, и я думаю, что вы решите свою проблему.

((true|false)?"somestring":"anotherstring")
3 голосов
/ 11 марта 2011

Если у вас string + (bool)?"somestring":"anotherstring" + string, + вычисляется до ?, поэтому вам нужны скобки:

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

2 голосов
/ 11 марта 2011

просто почистите его немного ... и вы не столкнетесь с проблемами с приоритетом операторов

  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));
    }
0 голосов
/ 11 марта 2011

Аддитивный оператор (+) имеет более высокий приоритет, чем условный (? :), как указано здесь: http://msdn.microsoft.com/en-us/library/aa691323%28v=vs.71%29.aspx.

Поэтому вам нужно поставить круглые скобки вокруг всего условия:

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

Я предлагаю вам разделить код на несколько строк, ввести некоторые временные переменные и использовать string.format (), чтобы он выглядел более понятным. Обнаружение ошибок в чистом коде намного проще.

0 голосов
/ 11 марта 2011

Приоритет не то, что вы ожидаете - + оценивается первым.Ваш код должен иметь вид:

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

Обратите внимание, что это очень длинное выражение, и его, вероятно, следует разбить на несколько операторов, чтобы сделатьэто более читабельно и ремонтопригодно.

...