2010-11-27 67 views

回答

25

编译器忽略左侧时,找出右侧的类型。所以,当它试图推断类型的

Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar) 

它这样做无需支付任何注意一个事实,左手侧是long?。以确定它注意到

Int64.Parse(myOtherVar) 

long现在试图查看是否null是或者可以被隐式转换为long右手侧的类型。由于它不能,你会看到你看到的错误信息。

从C#规范的§7.14:

形式b ? x : y ....

第二和第三运算数,xy的条件表达式?:操作员控制的,该类型的条件表达式。

(1)如果x有类型Xy有类型Y然后

一个。如果存在从XY而不是从YX的隐式转换(第6.1节),则Y是条件表达式的类型。

b。如果存在从YX而不是从XY的隐式转换(第6.1节),则X是条件表达式的类型。

c。否则,不能确定表达式类型,并发生编译时错误。

(2)如果只xy一个有一个类型,并且两个xy,areimplicitly转换为这种类型的,那么这就是条件表达式的类型。

(3)否则,不能确定表达式类型,并发生编译时错误。

注意,我们是在情况(2)其中xnull,没有一个类型,yInt64.Parse(myOtherVar),且类型long。请注意,x不会隐式转换为y的类型。因此,上面的(1)和(2)都失败了,我们导致(3)导致了编译时错误,这引发了你的问题。 注意上面隐含的结论,即左侧在确定右侧的类型时不起作用。

为了改善这种情况与

(long?)Int64.Parse(myOtherVar) 

更换

Int64.Parse(myOtherVar) 

现在,之所以

myVar = null; 

是好的地方myVar被声明为long?是因为编译器知道有是从012开始的隐式转换至long?

最后,如果myOtherVar无法解析为long,则会抛出Int64.Parse。请注意,您也正在执行两次解析,这是不必要的。一个更好的模式是

long value; 
if(Int64.TryParse(myOtherVar, out value)) { 
    myVar = value == 0 ? null : (long?)value; 
} 
else { 
    // handle case where myOtherVar couldn't be parsed 
} 
+0

奇怪的是,Int64.Parse(myOtherVar)== 0? (long?)null:Int64.Parse(myOtherVar);作品。 – 2010-11-27 05:11:11

2

由于三元运算符的最后部分,您的运营商使用返回的是Int64,而不是nullable。如果你这样做,而不是它可能工作:

long? myVar = Int64.Parse(myOtherVar) == 0 ? null : 
    (long?)Int64.Parse(myOtherVar); 

让您在返回long?代替,所以null不需要转换为Int64

此外,要转换的值的两倍您代码,不必要的(一次测试,一次获得值)。您的代码可能会更好,因此:

long? tempVar = Int64.Parse(myOtherVar); 
long? myVar = tempVar==0? null : tempVar; 
2

我相信你的意思是说:的

myVar = value == 0 ? null : (long?)value; 

代替

myVar = value == 0 ? null : value; 

我喜欢 '出' 变量的使用。 谢谢。

0

这将工作:

long? myVar = (long?)myOtherVar == 0 ? null : (long?)myOtherVar; 

..for那些谁喜欢简短的回答。

0

编译器试图从左至右

long? myVar = Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar); 

int64.parse方法返回一个值long不是nullable长值计算表达式。所以nullInt64.Parse(myOtherVar); 所以之间没有转换,试试这个

long? myVar = Int64.Parse(myOtherVar) == 0 ? (long?) null : Int64.Parse(myOtherVar); 

OR
long? myVar = Int64.Parse(myOtherVar) == 0 ? null : (long?) Int64.Parse(myOtherVar);

相关问题