2010-06-11 59 views
0

可能重复:
Nullable types and the ternary operator. Why won’t this work?C#可空类型的问题

例如:

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);不缺少(如果..ELSE ..)?

+0

@Gishu,精确复制我说。 @TatMing检查链接副本的答案。 – Paolo 2010-06-11 07:16:36

+0

Eric Lippert在最近的博客文章中提到:[http://blogs.msdn.com/b/ericlippert/archive/2010/05/27/cast-operators-do-not-obey-the-distributive-law。 ASPX](http://blogs.msdn.com/b/ericlippert/archive/2010/05/27/cast-operators-do-not-obey-the-distributive-law.aspx) – benPearce 2010-06-11 07:19:01

回答

4

三元运算符的最后两个操作数应该产生相同的类型。

演员一左一右int?

taxid = ddlProductTax.SelectedValue == "" ? 
           (int?)null 
           : Convert.ToInt32(ddlProductTax.SelectedValue); 

你可以看到在规范的具体行为:

0

应用此改正,它应该工作。

int? taxid; 
taxid = (ddlProductTax.SelectedValue == "" ? null : new int?(Convert.ToInt32(ddlProductTax.SelectedValue))); //Now it works. 
0

这里是一个小的辅助方法

taxid = GetNullableInt32(ddlProductTax.SelectedValue); 

public static int? GetNullableInt32(string str) 
{ 
     int result; 
     if (Int32.TryParse(str, out result)) 
     { 
      return result; 
     } 
     return null; 
} 
0

我认为这是到其中表达式的计算方式。 随着? :构造两个结果必须蒸发到相同的类型,这里null值和Int32之间没有隐式转换。

尝试:

taxid = (ddlProductTax.SelectedValue == "")? Convert.ToInt32(null) : Convert.ToInt32(ddlProductTax.SelectedValue);