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

时间:2017-09-29 10:39:32

标签: c# .net methods parameters

在研究这个问题时,我发现了这个问题:Why C# allows that only the last parameter of a method is of "variable length"

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

但是没有提到以下想法:

void Foo(int head, params int[] body, int tail)

或者具体说明:为什么我们没有 {{1>,而不是问为什么你不能有多个params论点?参数,但不是在最后(在中间某处或在开头)?

我想不出为什么会这么复杂,但请证明我错了!

例如,假设以下函数:

params

我认为结果应该是毫无疑问的。

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

没有"如何确定Foo(1, 2) // 1 [] 2 Foo(1, 2, 3) // 1 [2] 3 Foo(1, 2, 3, 4) // 1 [2, 3] 4 结束的位置,然后a开始?" (在这个案例中对链接问题的评论最多)所以我没有看到问题。

1 个答案:

答案 0 :(得分:6)

这些功能:

void Foo(int a, params int[] b)
void Foo(int a, params int[] b, int c)
void Foo(params int[] a, int b)

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

但是,如果您有以下内容,则无法解决哪一个:

Foo(1, 2, 3);

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

像C#这样的高级语言的目标是避免模棱两可,让开发人员处于良好的轨道。如果您必须完全更改代码的结构,因为您添加了一行代码,现在某些语言功能不再可用,它无法帮助您。

所以,是的,这是可能的,但我非常怀疑它对全球开发者有帮助。

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

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

相关问题