为什么C#允许在集合初始值设定项中使用尾随逗号,而不是在params中?

Den*_*Den 11 c# syntax comma

有效语法:

var test = new List<string>
{
   "a",
   "b",
   "c",//Valid trailing comma
};
Run Code Online (Sandbox Code Playgroud)

无效的语法:

private void Test(params string[] args)
{
}

Test(
   "a",
   "b",
   "c",//Invalid trailing comma
);
Run Code Online (Sandbox Code Playgroud)

这是语法不一致还是计算决策的问题?

Ada*_*rth 10

因此,即使我不知道"真正的"原因,因为我不在编译器团队中,所以我会对此进行一次尝试 - 并且一次出现的可能性值得怀疑.

尾随逗号通常在一些场景中很有用,即合并和代码生成.在收集或属性初始化器和枚举之类的上下文中,留下尾随逗号是无害的(编译器可以安全地推断出"列表末尾",因为它还有一个可以挂钩的闭合块括号.

方法参数非常明确 - 编译器需要在此区域进行大量控制,以便在人们编码和其他辅助功能时提供良好的反馈.在方法参数上留下一个尾随逗号不会添加上面的任何值,并且我开始对如何处理"不完整"代码造成混淆(用户是故意将它留在那里还是他们只是要在下一个参数中键入?).

你是正确的,params落入概念在该间隙你看到他们作为一个数组,并作为逗号分隔,您可以指定它们(这是集合initialisers之前支持).那么为什么它们会从收藏初始化者中脱颖而出呢?

params位的语言规范没有明确指定尾随逗号支持,尽管它适用于集合初始化程序以实现与其他语言(我认为是C++)的奇偶校验,这增加了开发人员从其他地方迁移到C#的熟悉程度.

我的假设:事实上它不符合规范然后导致YAGNI应用,从那时起,该特征的价值主张是一个明智的选择,而不是实现它.

  • "用户是故意将它留在那里还是他们只是打算在下一个论点中输入?" 推理同样适用于枚举和初始化列表.此外,方法调用也存在于生成的代码中,并且也正在合并:) (2认同)
  • 实际上,但推理并不重要,因为编译器并没有尝试连接未知的枚举值.我认为它属于最低价值和发展成本的范畴.肯定存在争论,我不会以任何方式争论.我只是想弄清楚为什么事情就像他们一样. (2认同)