41

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

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

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

4

7 回答 7

46

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

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

...

foobar(new[] { 1, 2, 3 }, new[] { "a", "b", "c" });
于 2012-08-07T03:11:38.287 回答
37

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

void Mult(params int[] arg1, params long[] arg2)

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

Mult(1, 2, 3);

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

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[] {         });

但是,您可以像这样将两个数组作为参数:

void Mult(int[] arg1, params long[] arg2)
于 2012-08-07T03:12:00.450 回答
20

I know this is a super old post, but here:

In C# 7, you actually can. You can use System.ValueTuple to do this:

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

And then you can use it like this:

private void Main() => Foobar((3, "oo"), (6, "bar"), (7, "baz"));

And the obvious output:

Foo: 3, Bar: foo
Foo: 6, Bar: bar
Foo: 7, Bar: baz

The only downside is you have to do this: foobars[0].foo; instead of foos[0];, but that's really a tiny tiny issue. Besides, if you really wanted to, you could make some extension or function to convert them to arrays, though I don't think that's really worth it.

于 2018-05-17T18:24:50.143 回答
12

来自MSDN - 参数

方法声明中 params 关键字后面不允许有附加参数,方法声明中只允许有一个 params 关键字

于 2012-08-07T03:24:22.527 回答
6

不,只允许一个参数,即使这也必须是最后一个参数。读这个

这将起作用

public void Correct(int i, params string[] parg) { ... }

但这行不通

public void Correct(params string[] parg, int i) { ... }
于 2012-08-07T03:12:23.807 回答
1

这是不可能的。每个方法声明可能只有一个 params 关键字 - 来自 MSDN - http://msdn.microsoft.com/en-us/library/w5zay9db(v=vs.71).aspx

于 2012-08-07T03:13:24.183 回答
0
void useMultipleParams(int[] foo, string[] bar)
{
}


useMultipleParams(new int[]{1,2}, new string[] {"1","2"}) 
于 2012-08-07T03:15:35.177 回答