【问题标题】:C# coalescing operator with 3 possible return values?具有 3 个可能的返回值的 C# 合并运算符?
【发布时间】:2014-04-15 13:24:08
【问题描述】:

只需阅读此运算符 ?? 的规范,因为它取左侧,如果为 null,则返回右侧的值。

我的问题是,我可以让它返回 3 个可能的值吗?

类似这样的:

int? y = null;
int z = 2;

int x = y ?? (z > 1 ? z : 0);

这可能吗?

【问题讨论】:

  • 你尝试的时候发生了什么?

标签: c# asp.net operators coalescing


【解决方案1】:

当然 - 您可以像使用任何其他二元运算符一样使用 ??,这意味着您可以在其左侧和/或右侧使用任何表达式。

例如,您可以这样做:

int? a = ...
int? b = ...
int? c = ...
int? d = ...
int? res = (condition_1 ? a : b) ?? (condition_2 ? c : d);

此表达式将首先计算(condition_1 ? a : b),检查它是否为null,然后使用非空值作为结果,或者计算右侧,并将其作为结果。

您还可以“链接”空合并运算符??,如下所示:

int? res =a ?? b ?? c ?? d;

这个表达式的计算从左到右。

【讨论】:

  • 我不明白这个链接......它是如何工作的。您是否必须在 int 末尾加上问号 int? 才能使其以这种方式工作?
  • @SolomonClosson ?? 表达式需要在其左侧为空,因此在我上面的示例中,abc 必须是 int?d 可以是 int?int。链式表达式从左到右计算 - 首先是a??b,然后是(a??b)??c,然后是((a??b)??c)??d
  • 很好奇,如果我想对Dictionary<string, string> 执行此操作以便在未找到密钥的情况下放入默认值怎么办?会这样做:Dictionary<string?, string> myDictionary = new Dictionary<string?, string>();,而我可以这样做:string theKey = myDictionary["keyNotinDictionary"] ?? "Not Found";??
  • @SolomonClosson 没有。首先,Dictionary<K,V> 是一个引用类型,即它已经可以为空,所以你不需要??。其次,当密钥不存在并且您调用dict[...] 时,Dictionary 会引发异常。不幸的是,您不能在一行中完成 - 您可以做的最好是两行:string res; string theValue = myDictionary.TryGetValue("keyNotinDictionary", out res) ? res : "Not Found";
【解决方案2】:

?? 是一个二元运算符,但第二个操作数(右侧)可以是您想要的任何表达式(只要它具有与第一个操作数合并的合适返回类型)。所以是的,第二个操作数可以是(z > 1 ? z : 0)。这不会使 ?? 有 3 个可能的返回值。

【讨论】:

  • 好的,谢谢。只是想在这里检查这是否是一个有效的思考过程。
【解决方案3】:

您的代码完全合法。您还可以执行以下操作:

int x = a ?? b ?? c;

【讨论】:

  • 但是如果a 和/或b 不能为空,对吧?
  • 对。 ??用于可为空。但这是您可以用来在三个值之间进行选择的一种方法。
【解决方案4】:

是的,这是可能的。 尝试编译并进行一些您应该自己验证的测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2019-03-18
    • 2011-08-10
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2011-11-08
    相关资源
    最近更新 更多