2

这是我的代码:

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;

但我不明白为什么会提出这个错误任何建议?

4

3 回答 3

2

发生这种情况是因为编译器首先尝试评估右侧。

int.Parse((e.Item.FindControl("BankName_dd") as DropDownList).SelectedValue)是 int 且不可为空,因此参数(即 int 和 null)之间存在不匹配

如果你这样做,即使这也很好。这现在将第一个参数唤醒为可为空的 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;

所以已经回答了链接

于 2013-08-15T09:05:45.517 回答
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 是条件表达式的类型。否则,无法确定表达式类型,并出现编译时错误。

于 2013-08-15T09:02:20.350 回答
1

结果=表达式1?表达式2:表达式3;

表达式 2 和表达式 3 必须是同一类型。而且 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;
于 2013-08-15T09:07:34.797 回答