编译器忽略左侧时,找出右侧的类型。所以,当它试图推断类型的
Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar)
它这样做无需支付任何注意一个事实,左手侧是long?
。以确定它注意到
Int64.Parse(myOtherVar)
是long
现在试图查看是否null
是或者可以被隐式转换为long
右手侧的类型。由于它不能,你会看到你看到的错误信息。
从C#规范的§7.14:
形式b ? x : y
....
第二和第三运算数,x
和y
的条件表达式?:
操作员控制的,该类型的条件表达式。
(1)如果x
有类型X
和y
有类型Y
然后
一个。如果存在从X
到Y
而不是从Y
到X
的隐式转换(第6.1节),则Y
是条件表达式的类型。
b。如果存在从Y
到X
而不是从X
到Y
的隐式转换(第6.1节),则X
是条件表达式的类型。
c。否则,不能确定表达式类型,并发生编译时错误。
(2)如果只x
和y
一个有一个类型,并且两个x
和y
,areimplicitly转换为这种类型的,那么这就是条件表达式的类型。
(3)否则,不能确定表达式类型,并发生编译时错误。
注意,我们是在情况(2)其中x
是null
,没有一个类型,y
是Int64.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
}
奇怪的是,Int64.Parse(myOtherVar)== 0? (long?)null:Int64.Parse(myOtherVar);作品。 – 2010-11-27 05:11:11