是否可以使用条件运算符将值分配给可空值?

发布于 2024-11-19 19:38:09 字数 337 浏览 2 评论 0原文

我知道我可以做到这一点:

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;

有没有办法使用条件运算符将值分配给可空值?

I know I can do this:

Int32 tempInt;
Int32? exitNum;

if (Int32.TryParse(fields[13], out tempInt))
    exitNum = tempInt;
else
    exitNum = null;

But why can't I do this?

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

Is there a way to assign a value to a nullable using the conditional operator?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

郁金香雨 2024-11-26 19:38:09

条件运算符的一侧必须可转换为另一侧的类型。
就您而言,一侧有一个 int,另一侧有 null (无类型表达式)。由于双方都不直接兼容另一方,因此它不起作用。

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

写入 Int32.TryParse(fields[13], out tempInt) ? tempInt : 新的 int?()

One side of the conditional operator must be convertible to the type of the other side.
In your case, you have an int on one side, and null (a type-less expression) on the other side. Since neither side is directly compatible with the other side, it doesn't work.

You need to make sure that at least one side is an int?, either by casting, or by writing new int?().

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

终难愈 2024-11-26 19:38:09

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

哪个读起来更愉快。

As others have noted, you have to insure that there is a consistent return type present in the conditional operator. (A subtle feature of C# is that when we must produce a type for an expression amongst several alternatives, the chosen alternative is always somewhere in the expression; we never "magic up" a type that didn't appear.)

If unusual facts about the conditional operator interest you, I recommend my articles on the subject:

http://blogs.msdn.com/b/ericlippert/archive/tags/conditional+operator/

I would add that this is a great opportunity to write an extension method:

static class MyExtensions
{
    public static int? ParseInt(this string s)
    {
        int value;
        return Int32.TryParse(s, out value) ? value : (int?)null;
    }
}

And now you can just say

int? exitNum = fields[13].ParseInt();

which is much more pleasant to read.

疧_╮線 2024-11-26 19:38:09

你只需要对 Int32 进行强制转换?临时值

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

You just need to do a cast to Int32? on tempInt

Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? (int?)tempInt : null;
多孤肩上扛 2024-11-26 19:38:09

你可以将 null 转换为 int 吗?使双方具有相同的类型:

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

You can cast null to int? so that both sides have same type:

Int32 tempInt;
Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? tempInt : (int?)null;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文