【问题标题】:Why C# only allows the last parameter to be of "params type"为什么 C# 只允许最后一个参数是“参数类型”
【发布时间】:2023-03-11 17:57:01
【问题描述】:

在研究这个时我发现了这个问题: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)

或者具体一点:不要问为什么你不能有多个 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 的结束位置和b 的开始位置?” (对链接问题的最高评论)在这种情况下,所以我看不到问题。

【问题讨论】:

  • 也许是因为编写编译器会更难(但仍然可能)?
  • tail 只是body 数组的最后一个元素:body.Last()。您可以简单地使用 void Foo(params int[] elements) 并具有隐式的头/尾。
  • @Sinatr ofc,但这只是说明我观点的一个示例。头-身-尾系统恰好是我想到要拿来做例子的第一件事

标签: c# .net methods parameters


【解决方案1】:

这些功能:

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);

我认为如果你说:“你可以在任何你想要的地方使用 use params,我认为这将是一种“语言规范的味道”,除非如果在编译过程中的某个时刻有一个模棱两可的调用”。


像 C# 这样的高级语言的目标是避免歧义并让开发人员走上良好的轨道。如果您必须完全改变代码的结构,因为您添加了一行代码,而现在某些语言功能不再可用,那么它对您没有帮助。

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

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

这也会大大增加链接到其他程序集的难度。

【讨论】:

  • 幸运的是,“语言规范气味”无论如何都是不可能的,除非在从其他程序集可访问的任何方法中完全禁止该语法。
  • 我在这里,花了 30 分钟的时间思考为什么当前的系统是这样的,但答案却如此简单。我怎么会错过呢?我知道会有一些东西(否则它不会被禁止)我只是无法弄清楚我的生活是什么。谢谢!
  • @OlleKelderman 很多像这样令人费解的问题一直发生在我身上。希望,所以在这里:)。不客气。
猜你喜欢
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多