2011-09-10 195 views
1

为什么视觉工作室给我一个错误:错误的Visual Studio

public void afunction(int? bar){ somecode } 

afunction(String.IsNullOrEmpty(Request["foo"])?null:int.Parse(Request["foo"])); 

它给我没有空之间没有implcit转换和int

回答

4

的第2和第3个操作数?运算符必须具有兼容类型。他们不在你的情况下,第二个是空的,第三个是int。没有隐式从int到null或从null到int的转换。只有明确的,像转换为对象或Nullable<int>。您可以考虑使用这样的:这里

afunction(String.IsNullOrEmpty(Request["foo"]) ? default(int?) : int.Parse(Request["foo"])); 

没有问题,因为有从int隐式转换为int?

+0

我明白你说的是什么,但它似乎是语言中的一个弱点 –

+0

静态类型语言(如C#)中的标准票价允许表达式成为语句。这阻止了编译器从结果类型推断预期的转换。在许多情况下可以这样做,就像你的一样,不会影响语言设计者。一致性对他们很重要。 –

1

你需要稍微改变你的方法,如:

? null : new Nullable<int>(int.Parse(Request["foo"])); 

编译器表达,你是负责类型转换。

+0

Resharper建议我“?null:new int?(int.Parse(Request [”idM“]))” –

1

的简化版本:

int? x = true ? null : 1; 

无法确定条件表达式的类型,因为有<null>和“INT”

之间的隐式转换所以有条件操作者不作为工作你期望(关于类型转换)。
重构不会伤害任何东西,只是把它分解成可读的东西。

+0

这不是重构的问题,而是理解,谢谢 –