多个"参数"参数是否可能?

gar*_*hao 28 c# parameters params

params在C#中可以有多个参数吗?像这样的东西:

void foobar(params int[] foo, params string[] bar)
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否可行.如果是,编译器将如何决定在哪里拆分参数?

Sam*_*eff 38

你只能有一个参数.您可以有两个数组参数,调用者可以使用数组初始化程序来调用您的方法,但只能有一个params参数.

void foobar(int[] foo, string[] bar)

...

foobar(new {1, 2,3}, new {"a", "b", "c"});
Run Code Online (Sandbox Code Playgroud)


Col*_*son 33

不,这是不可能的.拿着这个:

void Mult(params int[] arg1, params long[] arg2)
Run Code Online (Sandbox Code Playgroud)

编译器应该如何解释这个:

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

它可以被解读为以下任何一个:

Mult(new int[] {         }, new long[] { 1, 2, 3 });
Mult(new int[] { 1       }, new long[] {    2, 3 });
Mult(new int[] { 1, 2    }, new long[] {       3 });
Mult(new int[] { 1, 2, 3 }, new long[] {         });
Run Code Online (Sandbox Code Playgroud)

你可以将两个数组作为这样的参数:

void Mult(int[] arg1, params long[] arg2)
Run Code Online (Sandbox Code Playgroud)

  • @newfal正确,但我没有错,所以我对downvote感到困惑. (4认同)
  • 如果参数组的类型不同,那么编译器可以解释..例如让我们说 method(params int[] numbers, params string[] texts){} 。方法(34,76,“嗨”,“你好吗!”); (2认同)
  • 我不会支持这样的事情,因为隐式类型转换已经是 c# 中的一个东西,并且会非常混乱。但是支持多个参数并像重载和可选参数一样添加歧义警告并不难。 (2认同)

Hab*_*bib 12

来自MSDN - params

在方法声明中的params关键字之后不允许使用其他参数,并且在方法声明中只允许使用一个params关键字.


Aus*_*yan 11

我知道这是一个非常老的帖子,但是在这里:

在C#7中,您实际上可以。您可以使用System.ValueTuple以下方法:

private void Foorbar(params (int Foo, string Bar)[] foobars)
{
    foreach (var foobar in foobars)
        Console.WriteLine($"foo: {foobar.Foo}, bar: {foobar.Bar}");   
}
Run Code Online (Sandbox Code Playgroud)

然后您可以像这样使用它:

private void Main() => Foobar((3, "oo"), (6, "bar"), (7, baz));
Run Code Online (Sandbox Code Playgroud)

和明显的输出:

Foo: 3, Bar: foo
Foo: 6, Bar: bar
Foo: 7, Bar: baz
Run Code Online (Sandbox Code Playgroud)

唯一的缺点是您必须这样做:foobars[0].foo;而不是foos[0];,但这确实是一个很小的小问题。此外,如果您确实愿意,可以进行一些扩展或函数以将它们转换为数组,尽管我认为这样做并不值得。


Nik*_*wal 5

不可以,只允许使用一个参数,甚至必须是最后一个参数。读这个

这会起作用

public void Correct(int i, params string[] parg) { ... }
Run Code Online (Sandbox Code Playgroud)

但这行不通

public void Correct(params string[] parg, int i) { ... }
Run Code Online (Sandbox Code Playgroud)