这是我的代码:
int? BankName_dd =
int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue) != -1 ?
int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue) : null;
但我不明白为什么会出现这个错误的任何建议?
答案 0 :(得分:2)
这是因为编译器首先尝试评估右侧。
int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue)
是int且不可为空,因此参数之间存在不匹配,即int和null
如果你这样做,即使这样也没关系。现在将第一个参数唤醒为nullable int
int? BankName_dd = int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue) != -1 ? (int?)int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue):null;
答案 1 :(得分:1)
这样做
int? BankName_dd = int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue) != -1 ? int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue):(int?)null;
您的代码可以通过
重构int? BankName_dd = int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue);
if(BankName_dd.Value == -1)
BankName_dd = null;
原因。 C#3.0规范的相关部分是7.13,条件运算符:
?:运算符的第二个和第三个操作数控制的类型 条件表达式。设X和Y为第二个和第二个的类型 第三个操作数。然后,
如果X和Y是相同的类型,那么这是条件的类型 否则,如果从X到Y存在隐式转换(第6.1节),但是 不是从Y到X,那么Y是条件表达式的类型。 否则,如果存在从Y到X的隐式转换(第6.1节),但是 不是从X到Y,那么X是条件表达式的类型。 否则,不能确定表达式类型和编译时 发生错误。
答案 2 :(得分:1)
result = expression1? expression2:expression3;
expression2和expression3必须属于同一类型。并且null不是有效的int,因此如果expression2是int,则expression3不允许null。你可以用int吗?通过将null转换为它并使用int到int的隐式转换来作为两者的类型?在左侧。
你的表达虽然没有多大意义。你正在做两次所有的工作。
var result = int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue);
int? BankName_dd = null;
if(result != -1) BankName_dd = result;