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

ctr*_*yan 3 c# nullable conditional-operator

我知道我可以这样做:

Int32 tempInt;
Int32? exitNum;

if (Int32.TryParse(fields[13], out tempInt))
    exitNum = tempInt;
else
    exitNum = null;
Run Code Online (Sandbox Code Playgroud)

但为什么我不能这样做呢?

Int32 tempInt;
Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? tempInt : null;
Run Code Online (Sandbox Code Playgroud)

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

SLa*_*aks 11

条件运算符的一侧必须可转换为另一侧的类型.
在你的情况下,你有int一面,另一边有null(无类型表达式).由于两侧都不与另一侧直接兼容,因此不起作用.

你需要确保至少有一方是int?铸造或通过书写new int?().

Int32.TryParse(fields[13], out tempInt) ? tempInt : new int?()

  • 另一个选择是使用`default(int?)`而不是`new int?()`. (2认同)

Eri*_*ert 6

正如其他人所指出的那样,您必须确保条件运算符中存在一致的返回类型.(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

而现在你可以说

int? exitNum = fields[13].ParseInt();
Run Code Online (Sandbox Code Playgroud)

这是更愉快的阅读.