【问题标题】:Unpacking an array into method arguments将数组解包到方法参数中
【发布时间】:2013-02-20 15:27:01
【问题描述】:

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

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

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

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

但是假设我想使用ints1 的数组调用Add。这是否可能以及如何(最好没有反思)?我尝试了以下方法,但它们给出了语法错误(语法纯属猜测):

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

1 我的实际用例有所不同,但我认为这个例子不会那么复杂。

【问题讨论】:

  • 不起作用是什么意思?
  • @Antonijn 语法错误。
  • stackoverflow.com/questions/36350/… 这个帖子说它应该可以工作。简化是否隐藏了什么?
  • 你能定义“不起作用”吗?您是否收到编译时错误、运行时错误或意外输出?
  • 你在一个不返回任何东西的方法中返回一些东西 (void)

标签: c# arrays syntax variadic-functions params-keyword


【解决方案1】:

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

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

要使用数组调用它,您只需使用方法调用的普通语法:

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

【讨论】:

  • 如果Add 接受object[] 会发生什么?任何类型都可以转换为object,所以这不是模棱两可吗?
  • 您实际上需要转换内部对象。你可以试试 var xsAsObjcet = xs.ToList.Cast().ToArray;
【解决方案2】:

params 关键字基本上只允许您利用一点语法糖。它告诉编译器当它看到

Add(1, 2, 3);

它应该将其转换为

Add(new int[] { 1, 2, 3});

因此,要从您的代码中执行此操作,您无需执行任何特殊操作。

 int[] parameters = new int[] { ... }
 results = Add(parameters);

更多详情请见the documentation

【讨论】:

  • 使用 @params 作为 C# 关键字的变量名。这不会编译
【解决方案3】:

据我所知,您可以像使用普通方法一样使用数组调用它:

Add(xs);

没什么花哨的,方法调用上没有 params 关键字,没有点。

【讨论】:

    【解决方案4】:
    static void Main(string[] args)
    {
        int[] tmp =  {1, 2};
        var sum = Add(tmp);
    }
    public static int Add(params int[] xs)
    {
        return xs.Sum();
    }
    

    应该可以正常工作..

    【讨论】:

      【解决方案5】:

      如果它是 Java 之类的东西,你可以只调用带有数组作为参数的方法。

      这个特性也让可变参数变得危险,尤其是当可变参数类型之一也是数组时...

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 1970-01-01
        • 2021-12-27
        • 2014-04-21
        • 2018-08-29
        • 1970-01-01
        • 2013-09-30
        • 1970-01-01
        相关资源
        最近更新 更多