有效语法:
var test = new List<string>
{
"a",
"b",
"c",//Valid trailing comma
};
无效的语法:
private void Test(params string[] args)
{
}
Test(
"a",
"b",
"c",//Invalid trailing comma
);
这是语法不一致还是计算决策的问题?
有效语法:
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
bit没有明确指定尾随逗号支持,虽然它适用于集合初始化程序以实现与其他语言(我认为是C ++)的奇偶校验,这增加了开发人员从其他地方迁移到C#的熟悉程度。
我的假设:事实上它不符合规范然后导致 YAGNI 申请,从那时起,该功能的价值主张是一个明智的选择,而不是实现它。
如果你看看词汇语法 这里
C.2.9数组
array-initializer:
{ variable-initializer-listopt }
{ variable-initializer-list , }// This comma is causing this
variable-initializer-list:
variable-initializer
variable-initializer-list , variable-initializer
调用函数就像这样.... MethodName(formal-parameter-listopt);
formal-parameter-list:
fixed-parameters
fixed-parameters , parameter-array
parameter-array
fixed-parameters:
fixed-parameter
fixed-parameters , fixed-parameter
fixed-parameter:
attributesopt parameter-modifieropt type identifier
parameter-modifier:
ref
out
parameter-array:
attributesopt params array-type identifier
没有留下逗号的地方 这是因为语言是这样写的,我不知道原因,但亚当知道