将数组展开为方法参数

11

如您所知,C#通过使用params关键字支持可变参数方法:

int Add(params int[] xs) {
    return xs.Sum();
}

然后您可以使用任何数量的参数调用它:

Add(1);
Add(1, 2);
Add(1, 2, 3);

但是,如果我想使用一个 int 数组 1 来调用 Add,这是否可能以及如何实现(最好不使用反射)?我尝试了以下代码,但它们都给出了语法错误(语法纯属猜测):

var xs = new[] { 1, 2, 3 };
Add(xs...); // doesn't work; syntax error
Add(params xs); // doesn't work; syntax error

1 我的实际用例不同,但我认为这个例子会更简单易懂。


你所说的“不起作用”是什么意思? - antonijn
@Antonijn 语法错误。 - user142019
这个线程说它应该可以工作。简化可能会隐藏一些东西吗? - Blast_dan
你的例子是无效的,因为你实际上可以使用一个 int 数组来调用 Add 方法。 - Ryszard Dżegan
你定义了一个void方法,但是你想返回一个int类型的值吗? - Soner Gönül
显示剩余2条评论
5个回答

15

您的方法需要一个返回类型:

int Add(params int[] xs) {
    return xs.Sum();
}

你只需使用方法调用的常规语法,并将其与数组一起调用:

int[] xs = new[] { 1, 2, 3 };
var result = Add(xs);

2
如果 Add 接受 object[],会发生什么?任何类型都可以转换为 object,那么这不是会产生歧义吗? - user142019
你实际上需要转换内部对象。 你可以尝试 var xsAsObjcet = xs.ToList.Cast<object>().ToArray; - Blast_dan

2
params 关键字基本上只是让您利用一些语法糖。它告诉编译器,当它看到 params 关键字时,参数可以作为数组传递给方法。在方法内部,您可以像使用数组一样使用这些参数。请注意保留 HTML 标签。
Add(1, 2, 3);

它应该将其转换为:
Add(new int[] { 1, 2, 3});

所以,如果你想从代码中实现这个功能,你不需要做任何特殊的事情。
 int[] parameters = new int[] { ... }
 results = Add(parameters);

请参阅文档获取更多详细信息。

1
在变量名中使用@params,这是一个C#关键字。这段代码无法编译。 - Ilya Ivanov

0
如果它与Java类似,您可以只需将数组作为参数调用该方法。
这个特性也是varargs危险的原因之一,特别是如果其中一个vararg类型也是一个数组...

0
据我所知,您可以像调用普通方法一样使用数组来调用它:
Add(xs);

没有花哨的东西,方法调用中没有params关键字,也没有点。


0
static void Main(string[] args)
{
    int[] tmp =  {1, 2};
    var sum = Add(tmp);
}
public static int Add(params int[] xs)
{
    return xs.Sum();
}

应该可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接