为什么空合并运算符在c#中破坏了我的字符串赋值?

pro*_*don 4 c# asp.net

我正在创建一个Web表单中的查询字符串,我正在处理可能为null的参数值.有很多方法可以检查和修复这些,但我找到的最优雅的方法如下:

string pass;
pass = "BillabilityDetail.aspx?_startDate=" + _startDate.Text + "&_endDate=" + _endDate.Text + 
       "&_isContractor=" + _isContractor.SelectedValue + "&_busUnit=" + _busUnit.Text 
       + "&_projectUnit=" + _projectUnit.SelectedValue + "&_leadCon=" + _leadCon.Value ?? -1
       + "&_acctExec=" + _acctExec.Value ?? -1 + "&_isBillable=" + _isBillable.SelectedValue + 
       "&_isActive=" + _isActive.SelectedValue + "&_include=" + _include.SelectedValue;
Run Code Online (Sandbox Code Playgroud)

唯一的问题是......它不起作用.代码到达此部分时,

"&_leadCon=" + _leadCon.Value ?? -1 + "&_acctExec=" + _acctExec.Value ?? -1 
Run Code Online (Sandbox Code Playgroud)

字符串停止分配值.所以字符串将以&_leadCon =结束.我知道如何解决这个问题,但我不知道为什么它首先停止工作.有小费吗?

Jam*_*are 14

+优先级高于??,因此你需要环绕在括号中的空合并表达式.

"&_leadCon=" + (_leadCon.Value ?? -1) + "&_acctExec=" + (_acctExec.Value ?? -1 )
Run Code Online (Sandbox Code Playgroud)

请参阅此处的优先级图表


tom*_*ing 11

尝试使用括号来告诉编译器你的意思.

例如:

"&_leadCon=" + (_leadCon.Value ?? -1) + "&_acctExec=" + (_acctExec.Value ?? -1)
Run Code Online (Sandbox Code Playgroud)