有效语法:

var test = new List<string>
{
   "a",
   "b",
   "c",//Valid trailing comma
};

无效的语法:
private void Test(params string[] args)
{
}

Test(
   "a",
   "b",
   "c",//Invalid trailing comma
);

是语法上的不一致还是经过计算的决定?

最佳答案

因此,即使我永远不知道不是编译器团队的“真正”原因,我也会对此采取行动-而且出现问题的可能性值得怀疑。

尾部逗号通常在几种情况下有用,即合并和代码生成。在集合或属性初始化器和枚举之类的东西的上下文中,留下逗号是无害的(编译器可以安全地推断“列表结尾”,因为它也可以使用一个封闭的括号括起来。

方法参数非常明确-编译器需要在此区域进行大量控制,以便在人们进行编码或其他辅助功能时提供良好的反馈。在方法参数上留下逗号结尾不会添加上述任何值,并且我开始引起如何处理“不完整”代码的困惑(用户是否故意将其保留在此处,或者它们只是要键入下一个参数?)。

您认为params属于概念上的空白是正确的,因为您将它们视为数组,并且可以将其指定为逗号分隔(在集合初始化程序之前受支持)。那么,为什么它们在风格上与集合初始化方法有所不同?
params位的语言规范未明确指定尾随逗号支持,尽管它确实对与其他语言(我认为是C++)进行奇偶校验的集合初始化程序进行了说明,这增加了从其他地方迁移到C#的开发人员的熟悉度。

我的假设是:事实并非如此,这导致YAGNI得以应用,从这一点出发,该功能的值(value)主张无疑是对不实现该功能的明智之举。

关于c# - 为什么C#在集合初始值设定项中允许尾随逗号,但在params中不允许尾随逗号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26865030/

10-13 08:08
查看更多