编译器在确定右侧的类型时会忽略左侧。所以当它试图推断出的类型时
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 的隐式转换(第6.1 节),但不存在从X 到Y,则X 是条件表达式的类型。
c。否则,无法确定表达式类型,并出现编译时错误。
(2) 如果x 和y 中只有一个具有类型,并且x 和y 都可以隐式转换为该类型,那么这就是条件表达式的类型。
(3) 否则无法确定表达式类型,出现编译时错误。
请注意,我们处于情况 (2),其中 x 是 null 并且没有类型,y 是 Int64.Parse(myOtherVar) 并且具有类型 long。请注意,x 不能隐式转换为 y 的类型。因此,(1)和(2)都在上面失败,我们导致(3)导致编译时错误,激发了你的问题。 请注意上面的隐含结论,左侧在确定右侧的类型方面没有作用。
纠正这个替换
Int64.Parse(myOtherVar)
与
(long?)Int64.Parse(myOtherVar)
现在,原因
myVar = null;
myVar 被声明为long? 是可以的,因为编译器知道存在从null 到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
}