为什么以下条件运算符在包含Nullable类型的StringBuilder中奇怪地工作?在C#?

时间:2013-03-11 10:31:31

标签: c# .net nullable stringbuilder conditional-operator

StringBuilder htmlResp=new StringBuilder();
int? cuID= 1;
string cuName="Tom";
string cuEmpID="ZXCV";

htmlResp .Append( "<option value=\"" + cuID.Value + "\">" + cuName+" ("+cuEmpID==""? "-":cuEmpID+")"+  "</option>");
html.Resp.ToString();

我无法理解为什么上面的代码(从实际代码中修改)总是给我带来奇怪的结果:“ZXCV”而不是“Tom(ZXCV)”。

有没有人知道背后的原因,如果可能的话可以提供参考?

2 个答案:

答案 0 :(得分:5)

您在条件表达式周围缺少一些括号。

请改为尝试:

string text = "<option value=\"" + cuID.Value + "\">" + cuName + " (" + (cuEmpID == "" ? "-" : cuEmpID) + ")" + "</option>";
htmlResp.Append(text);

至于为什么缺少的括号导致这种情况发生......这是一个有趣的问题!

要回答这个问题,请稍微简化一下原始代码:

string text = ">>>" + cuEmpID == "" ? "-" : cuEmpID + "<<<"; // Gives "ZXCV<<<"

发生的事情是条件表达式使用">>>" + cuEmpID == ""作为条件。这不等于“”,因此使用条件表达式的右侧,即cuEmpID + "<<<"部分,它给出了我们看到的输出。

你应该真正简化表达式,例如:

string normalisedEmpID = cuEmpID == "" ? "-" : cuEmpID;

string text = string.Format
(
    "<option value=\"{0}\">{1} ({2})</option>",
    cuID.Value,
    cuName,
    normalisedEmpID
);

答案 1 :(得分:3)

“不要使表达过于复杂”的一个很好的例子。

 "<option value=\"" + cuID.Value + "\">" + cuName 
        + " ("+cuEmpID==""? "-":cuEmpID+")"+  "</option>");

编译为

 ("<option value=\"" + cuID.Value + "\">" + cuName+" ("+cuEmpID ) == "" 
      ? "-"
      : cuEmpID+")"+  "</option>");

一个简单的'修复'就是

 "<option value=\"" + cuID.Value + "\">" + cuName + " (" 
       + ((cuEmpID == "") ? "-" : cuEmpID ) 
       + ")" + "</option>"

但为了便于阅读,请使用一些中间变量。 ?:永远不应嵌套在其他表达式中。