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);
实际上,因为字符串完美地连接了空字符串,你甚至不需要首先担心空字符串实际上,因为字符串完美地连接了空字符串,你甚至不需要首先担心空字符串