是否可以使用条件运算符为可空值赋值?

时间:2011-07-14 14:30:37

标签: c# nullable conditional-operator

我知道我可以这样做:

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;

有没有办法使用条件运算符为可空值赋值?

4 个答案:

答案 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;