为什么下面的条件操作符工作奇怪的StringBuilder包含空类型?在c#


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)"。

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

您的条件表达式周围缺少括号。

试试这个:

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

一个"不要让表达式太复杂"的好例子。

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

被编译为

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

一个简单的"修复"将是

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

,但为了可读性,使用一些中间变量。?:不应该嵌套在其他表达式中。

最新更新