可能重复:
Nullable types and the ternary operator. Why won’t this work?
例如:
int? taxid;
if (ddlProductTax.SelectedValue == "") {
taxid = null; }
else {
taxid = Convert.ToInt32(ddlProductTax.SelectedValue);
} //Correct
但是
int? taxid;
taxid = (ddlProductTax.SelectedValue == "" ? null : Convert.ToInt32(ddlProductTax.SelectedValue)); //Error
它出错,而且int32无法隐式转换。
(?truepart:falsepart);是不是(如果......)......
答案 0 :(得分:4)
三元运算符的最后两个操作数应该都产生相同的类型。
将任何一方投放到int?
:
taxid = ddlProductTax.SelectedValue == "" ?
(int?)null
: Convert.ToInt32(ddlProductTax.SelectedValue);
您可以在规范中看到确切的行为:
答案 1 :(得分:1)
重复
为什么它的工作原理。
Nullable types and the ternary operator: why is `? 10 : null` forbidden?
以下是修复:
string x = "";
int? taxid;
taxid = (x == "" ? null : (int?) Convert.ToInt32(x)); // add the int? cast
Console.WriteLine(taxid);
答案 2 :(得分:0)
应用此更正,它应该有效。
int? taxid;
taxid = (ddlProductTax.SelectedValue == "" ? null : new int?(Convert.ToInt32(ddlProductTax.SelectedValue))); //Now it works.
答案 3 :(得分:0)
这是一个小帮手方法
taxid = GetNullableInt32(ddlProductTax.SelectedValue);
public static int? GetNullableInt32(string str)
{
int result;
if (Int32.TryParse(str, out result))
{
return result;
}
return null;
}
答案 4 :(得分:0)
我认为这取决于表达式的评估方式。
使用? :
构造时,两个结果都必须转换为相同的类型,此处null
值和Int32
之间没有隐式转换。
尝试:
taxid = (ddlProductTax.SelectedValue == "" )? Convert.ToInt32(null) : Convert.ToInt32(ddlProductTax.SelectedValue);