【问题标题】:?? operator seems not to work -> enclose the ?? evaluation part with brackets??运算符似乎不起作用-> 附上 ??带括号的评估部分
【发布时间】:2013-06-12 06:57:35
【问题描述】:

最近我花了一些时间发现一个棘手的行为,我做了这样的事情

public static string GetPrefixedNameList(string[] names, string prefix = null)
{
    if (names == null || names.Length == 0)
        return "";
    return prefix ?? string.Empty + string.Join(", ", names);
}

很简单,我想 但我总是只得到前缀或空字符串,但从来没有加入名单

使其正常工作: 当它是一个中间结果时,总是用括号将“?? 评估部分”括起来!!

return (prefix ?? string.Empty) + string.Join(", ", names);

VS2012:没有警告,没有提示,加入名称部分被忽略了!!! 这似乎是编译器错误!!!

这不是一个真正的问题,也许其他人可以节省一些时间

【问题讨论】:

    标签: c# .net operators


    【解决方案1】:

    VS2012:没有警告,没有提示,加入名称部分被忽略了!!!这似乎是编译器错误!!!

    不,真的不是。这只是一个优先事项。 +?? 绑定更紧密。

    您已经编写了完全合法的 C# - 它只是没有按照您的预期进行。您的代码相当于:

    return prefix ?? (string.Empty + string.Join(", ", names));
    

    我个人会将代码重写为:

    prefix = prefix ?? string.Empty;
    return prefix + string.Join(", ", names);
    

    编辑:正如 Marc 所说,您甚至不需要在此处执行 任何操作 - 因为 null 在连接中以空字符串结尾,因此您只需要:

    return prefix + string.Join(", ", names);
    

    我注意到,如果names 为空或null,您会删除前缀,顺便说一句 - 这是故意的吗?另外,我建议您应该在 either 使用 "" 使用 string.Empty 之间保持一致。我个人使用"",但这是个人喜好问题。一致性虽然减少了惊喜:)

    有关 C# 中各种运算符等的优先级列表,请参阅 C# 5 规范的第 7.3.1 节。

    【讨论】:

    • 其实,因为 string 可以完美地拼接空字符串,所以你甚至不需要担心 null 放在首位
    【解决方案2】:

    如果您这样做,编译器也不会提供警告或提示:

    var d = a + b * c;
    

    当你的意思是:

    var d = (a + b) * c;
    

    在这两种情况下,这只是运算符优先级。这不是错误。

    至于“名称部分被忽略了” - 不;如果prefixnull,则将评估右侧(根据?? 运算符的规则)。在您的特定场景中要实现的重要一点是,没有括号您的表达式是有效的:

    return prefix ?? (string.Empty + string.Join(", ", names));
    

    就个人而言,我不建议学习运算符优先规则:如果有疑问。 添加更多括号

    return (prefix ?? "") + string.Join(", ", names);
    

    但是,字符串与 null 的连接忽略了 null,所以以下是可以的:

    return prefix + string.Join(", ", names);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2012-04-18
      相关资源
      最近更新 更多