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

oce*_*eam 6 .net c# stringbuilder nullable 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();
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*son 5

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

试试这个:

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

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

为了回答这个问题,让我简化一下原始代码:

string text = ">>>" + cuEmpID == "" ? "-" : cuEmpID + "<<<"; // Gives "ZXCV<<<"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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