C# ?? 操作员似乎不工作->;附上??带括号的评估部分

C# ?? 操作员似乎不工作->;附上??带括号的评估部分,c#,.net,operators,C#,.net,Operators,最近我花了一些时间来发现一个棘手的行为,我做了这样的事情 public static string GetPrefixedNameList(string[] names, string prefix = null) { if (names == null || names.Length == 0) return ""; return prefix ?? string.Empty + string.Join(", ", names); } 很简单,我想 但我总是只

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

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:没有警告,没有提示,加入名称部分被忽略!!! 这似乎是一个编译器错误

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

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
,您会删除前缀,顺便问一下,这是故意的吗?另外,我建议您在使用
或使用
string.Empty
之间保持一致。就我个人而言,我使用的是
,但这是一个品味问题。但一致性减少了惊喜:)

参见C#5规范第7.3.1节,了解C#中各种运算符等的优先级列表

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
,您会删除前缀,顺便问一下,这是故意的吗?另外,我建议您在使用
或使用
string.Empty
之间保持一致。就我个人而言,我使用的是
,但这是一个品味问题。但一致性减少了惊喜:)


参见C#5规范第7.3.1节,了解C#中各种运算符等的优先级列表。

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

var d = a + b * c;
你的意思是:

var d = (a + b) * c;
在这两种情况下,这只是运算符优先级。这不是一个错误

至于“名称部分被完全忽略”——否;如果
前缀
,则会对右侧进行评估(根据
运算符的规则)。在您的特定场景中,需要意识到的重要一点是,如果没有括号,您的表达式实际上是:

return prefix ?? (string.Empty + string.Join(", ", names));
就个人而言,我不建议学习运算符优先规则:如果有疑问添加更多论文

return (prefix ?? "") + string.Join(", ", names);
但是,使用null进行字符串连接会忽略null,因此可以执行以下操作:

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

如果您执行以下操作,编译器也不会提供警告或提示:

var d = a + b * c;
你的意思是:

var d = (a + b) * c;
在这两种情况下,这只是运算符优先级。这不是一个错误

至于“名称部分被完全忽略”——否;如果
前缀
,则会对右侧进行评估(根据
运算符的规则)。在您的特定场景中,需要意识到的重要一点是,如果没有括号,您的表达式实际上是:

return prefix ?? (string.Empty + string.Join(", ", names));
就个人而言,我不建议学习运算符优先规则:如果有疑问添加更多论文

return (prefix ?? "") + string.Join(", ", names);
但是,使用null进行字符串连接会忽略null,因此可以执行以下操作:

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

实际上,因为字符串完美地连接了空字符串,你甚至不需要首先担心空字符串实际上,因为字符串完美地连接了空字符串,你甚至不需要首先担心空字符串