我知道我可以这样做:
Int32 tempInt;
Int32? exitNum;
if (Int32.TryParse(fields[13], out tempInt))
exitNum = tempInt;
else
exitNum = null;
但为什么我不能这样做?
Int32 tempInt;
Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? tempInt : null;
有没有办法使用条件运算符为可空值赋值?
答案 0 :(得分:11)
条件运算符的一边必须可以转换为另一边的类型
在您的情况下,一侧有int
,另一侧有null
(无类型表达式)。由于任何一方都不与另一方直接兼容,因此不起作用。
您需要通过投射或撰写int?
来确保至少一方是new int?()
。
撰写Int32.TryParse(fields[13], out tempInt) ? tempInt : new int?()
答案 1 :(得分:6)
正如其他人所说,你必须确保条件运算符中存在一致的返回类型 present 。 (C#的一个微妙特征是,当我们必须在几个替代方案中为表达式生成一个类型时,所选择的替代方法总是在表达式中某处;我们永远不会“魔术化”一个没有的类型显示。)
如果关于条件运算符的不寻常事实让您感兴趣,我推荐我关于这个主题的文章:
http://blogs.msdn.com/b/ericlippert/archive/tags/conditional+operator/
我想补充一点,这是编写扩展方法的好机会:
static class MyExtensions
{
public static int? ParseInt(this string s)
{
int value;
return Int32.TryParse(s, out value) ? value : (int?)null;
}
}
现在你可以说
int? exitNum = fields[13].ParseInt();
阅读起来会更愉快。
答案 2 :(得分:1)
你只需要对Int32进行强制转换? on tempInt
Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? (int?)tempInt : null;
答案 3 :(得分:0)
你可以将null转换为int吗?所以双方都有相同的类型:
Int32 tempInt;
Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? tempInt : (int?)null;