为什么C#只允许最后一个参数是"params类型"

Oll*_*man 3 .net c# parameters methods

在研究这个时我发现了这个问题:为什么C#允许只有方法的最后一个参数是"可变长度"

虽然我100%同意那里的答案,并且理解允许这样的事情的规则将如那里所说的那样令人恐怖地复杂,但它并没有为我提供实际问题的答案.链接的问题谈到T f(params A[] a, params B[] b),所以params关键字的多个参数.

但是没有提到以下想法:

void Foo(int head, params int[] body, int tail)
Run Code Online (Sandbox Code Playgroud)

或者更具体地说:不要问为什么你不能有多个的params参数,我们为什么不能有一个单一的 params参数,但只是没有在最后(或者中间的某个位置,或开头)?

我想不出为什么那会复杂的一个原因,但请证明我错了!

例如,假设以下函数:

void Foo(int head, params int[] body, int tail)
{
    Console.WriteLine($"{head} [{string.Join(", ", body)}] {tail}");
}
Run Code Online (Sandbox Code Playgroud)

我认为结果应该是什么毫无疑问.

Foo(1, 2)       // 1 [] 2
Foo(1, 2, 3)    // 1 [2] 3
Foo(1, 2, 3, 4) // 1 [2, 3] 4
Run Code Online (Sandbox Code Playgroud)

没有"如何确定何处a结束并b开始呢?" (关于链接问题的最高评论)在这种情况下,所以我没有看到问题.

Pac*_*ac0 6

这些功能:

void Foo(int a, params int[] b)
void Foo(int a, params int[] b, int c)
void Foo(params int[] a, int b)
Run Code Online (Sandbox Code Playgroud)

有不同的签名,所以如果你告诉他们params可以在任何你想要的地方,他们应该被允许.

但是,如果您有以下情况,则无法解决要拨打的电话:

Foo(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

如果你说:"你可以params在任何你想要的地方使用,我认为这将是一种"语言规范气味" ,除非在编译期间的某个时刻有一个模糊的调用".


像C#这样的高级语言的目标是避免模糊不清并使开发人员处于良好的轨道.如果你必须完全改变你的代码结构,因为你添加了一行代码,现在一些语言功能不再可用了,它对你没有帮助.

所以,是的,这是可能的,但我严重怀疑它对全球开发者有帮助.

它会使规则变得复杂"你可以多次声明一个函数,只要它具有不同的签名"

这也会大大增加链接到其他组件的难度.