【问题标题】:C# Chaining params function callsC# 链接参数函数调用
【发布时间】:2014-04-01 23:52:14
【问题描述】:

是否可以在 C# 中接受 params 参数,然后将其作为 params 列表传递给另一个函数?就目前而言,如果我没记错的话,下面的函数会将args 作为一个单独的参数传递,该参数是object 类型的数组。这里的目标是不言而喻的。

//ScriptEngine
public object[] Call(string fnName, params object[] args)
{
    try{
        return lua.GetFunction(fnName).Call(args);
    }
    catch (Exception ex)
    {
        Util.Log(LogManager.LogLevel.Error, "Call to Lua failed: "+ex.Message);
    }
    return null;
}

lua.GetFunction(fnName).Call(args); 是对我的代码外部的调用,它接受 param object[]

【问题讨论】:

    标签: c# wrapper params


    【解决方案1】:

    如果您调用的Call 方法的签名接受params object[] args,那么您错了。它不考虑将args 的单个对象object 包装在另一个数组中。它认为它是整个参数列表,这就是你想要的。它会按原样正常工作。

    【讨论】:

    • 啊,我明白了,谢谢。那么params 将给定数组按其第一个维度展开以填充参数?
    • @selkathguy 不完全是。如果提供的类型完全匹配,它将完全通过它。如果不是,并且它可以将参数视为一项,则将其包装在一个数组中。如果它不能做任何一个,那么它就不会编译。如果提供的类型与数组类型完全匹配,则它不会将其视为整个数组,而是其中的一个对象。
    • 所以将一个包含 5 个对象的数组传递给像 fn(object a, object b, params object[] c) 这样的函数会将一个归档到 ab 中,然后其余的将被 c 吃掉?
    • @selkathguy 不,那不会编译。您需要传递两个对象和一个数组,或者两个对象和任意数量的附加对象。与其他一些语言不同,您不能将数组作为任意函数的参数列表传递(不使用反射)。
    • 知道了。非常感谢!
    【解决方案2】:

    是的,这是可能的。在您的情况下,args 实际上是一个对象数组。您的 Call 方法应该采用 params object[] 或只是一个对象数组作为参数。

    你不需要向params传递多个参数。你可以直接传递一个数组。例如这是完全有效的:

    public void SomeMethod(params int[] args) { ... }
    
    SomeMethod(new [] { 1, 2, 3 });
    

    【讨论】:

      【解决方案3】:

      可以将数组传递给另一个函数:

      void Main()
      {   
          int[] input = new int[] {1,2,3};
          first(input); //Prints 3
      }
      
      public void first(params int[] args)
      {
          second(args);
      }
      
      public void second(params int[] args)
      {
          Console.WriteLine(args.Length);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        • 1970-01-01
        相关资源
        最近更新 更多