编译器在确定右侧的类型时会忽略左侧。所以当它试图推断出
Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar)
它这样做并没有注意到左侧是 a 的事实long?。为了确定右侧的类型,它指出
Int64.Parse(myOtherVar)
is along并且现在尝试查看nullis 或可以隐式转换为 a long。由于它不能,您会收到您看到的错误消息。
来自 C# 规范的第 7.14 节:
b ? x : y...形式的条件表达式
运算符的第二个和第三个操作数andx控制条件表达式的类型。y?:
(1) If xhas type Xand yhas type Ythen
一种。如果从to存在隐式转换(第 6.1 节) ,但从XtoY不存在,则为条件表达式的类型。YXY
湾。如果从to存在隐式转换(第 6.1 节) ,但从YtoX不存在,则为条件表达式的类型。XYX
C。否则,无法确定表达式类型,并出现编译时错误。
(2) 如果只有一个xandy有一个类型,并且两个xand都y可以隐式转换为那个类型,那么这就是条件表达式的类型。
(3) 否则无法确定表达式类型,出现编译时错误。
请注意,我们处于情况 (2) 中xisnull和没有 type 并且yisInt64.Parse(myOtherVar)并且有 type long。请注意,x它不能隐式转换为y. 因此,(1)和(2)都在上面失败,我们导致(3)导致编译时错误,激发了你的问题。请注意上面的隐含结论,即左侧在确定右侧的类型中没有作用。
纠正这个替换
Int64.Parse(myOtherVar)
和
(long?)Int64.Parse(myOtherVar)
现在,原因
myVar = null;
可以在 wheremyVar按原样声明,long?因为编译器知道存在从nullto的隐式转换long?。
最后,Int64.Parse如果myOtherVar无法解析为long. 请注意,您还执行了两次解析,这是不必要的。更好的模式是
long value;
if(Int64.TryParse(myOtherVar, out value)) {
myVar = value == 0 ? null : (long?)value;
}
else {
// handle case where myOtherVar couldn't be parsed
}