此操作因There is no implicit conversion between 'null' and 'int'
long? myVar = Int64.Parse( myOtherVar) == 0 ? null : Int64.Parse( myOtherVar);
然而,这成功了:
if( Int64.Parse( myOtherVar) == 0)
myVar = null;
else
myVar = Int64.Parse( myOtherVar);
有没有办法让三元运算符成功?
答案 0 :(得分:25)
在确定右侧的类型时,编译器会忽略左侧。所以当它试图推断出
的类型时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
存在隐式转换(第6.1节),而不是Y
到X
,那么Y
是条件表达式的类型湾如果从
Y
到X
存在隐式转换(第6.1节),而不是X
到Y
,那么X
是条件表达式的类型℃。否则,无法确定表达式类型,并发生编译时错误。
(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?
的隐式转换。
最后,如果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
}
答案 1 :(得分: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 :(得分:2)
我相信你的意思是说:
myVar = value == 0 ? null : (long?)value;
而不是
myVar = value == 0 ? null : value;
我喜欢使用'out'变量。 感谢。
答案 3 :(得分:0)
这将有效:
long? myVar = (long?)myOtherVar == 0 ? null : (long?)myOtherVar;
..对于那些喜欢简短答案的人。
答案 4 :(得分:0)
编译器尝试从左到右评估表达式
long? myVar = Int64.Parse( myOtherVar) == 0 ? null : Int64.Parse( myOtherVar);
int64.parse
方法返回long
值而不是nullable
长值。所以null
和Int64.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);