编译器在确定右侧的类型时会忽略左侧。所以当它试图推断出
Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar)
它这样做并没有注意到左侧是 a 的事实long?
。为了确定右侧的类型,它指出
Int64.Parse(myOtherVar)
is along
并且现在尝试查看null
is 或可以隐式转换为 a long
。由于它不能,您会收到您看到的错误消息。
来自 C# 规范的第 7.14 节:
b ? x : y
...形式的条件表达式
运算符的第二个和第三个操作数andx
控制条件表达式的类型。y
?:
(1) If x
has type X
and y
has type Y
then
一种。如果从to存在隐式转换(第 6.1 节) ,但从X
toY
不存在,则为条件表达式的类型。Y
X
Y
湾。如果从to存在隐式转换(第 6.1 节) ,但从Y
toX
不存在,则为条件表达式的类型。X
Y
X
C。否则,无法确定表达式类型,并出现编译时错误。
(2) 如果只有一个x
andy
有一个类型,并且两个x
and都y
可以隐式转换为那个类型,那么这就是条件表达式的类型。
(3) 否则无法确定表达式类型,出现编译时错误。
请注意,我们处于情况 (2) 中x
isnull
和没有 type 并且y
isInt64.Parse(myOtherVar)
并且有 type long
。请注意,x
它不能隐式转换为y
. 因此,(1)和(2)都在上面失败,我们导致(3)导致编译时错误,激发了你的问题。请注意上面的隐含结论,即左侧在确定右侧的类型中没有作用。
纠正这个替换
Int64.Parse(myOtherVar)
和
(long?)Int64.Parse(myOtherVar)
现在,原因
myVar = null;
可以在 wheremyVar
按原样声明,long?
因为编译器知道存在从null
to的隐式转换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
}