使用条件运算符给可空类型赋值是否可行?

3
我知道我可以做到这一点:
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;

有没有一种使用条件运算符为可空变量赋值的方法?

1
“合并运算符”与您的问题有什么关系?该问题似乎是关于条件运算符,而不是合并运算符。 - Eric Lippert
可能是重复的问题[c#为什么可空int不能被赋值为null] (https://dev59.com/xXRC5IYBdhLWcg3wVvct) - Eric Lippert
4个回答

11

条件运算符的两侧必须能够转换为另一侧的类型。在您的情况下,您在一侧使用了 int,而在另一侧使用了无类型表达式 null。由于两侧都不直接与另一侧兼容,因此无法工作。

您需要确保至少一侧是 int?,可以通过强制转换或编写 new int?() 来实现。

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


2
另一个选项是使用default(int?)而不是new int?() - svick
1
new int?() 看起来很奇怪;这只是一个风格问题,但我更喜欢使用 default(int?)(int?)null - configurator

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();

这样阅读起来更加愉悦。


1

你只需要在tempInt上进行Int32?的转换

Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? (int?)tempInt : null;

0
你可以将 null 强制转换为 int?,这样两边就具有相同类型:
Int32 tempInt;
Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? tempInt : (int?)null;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接