Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何养活一个“孩子”;“参数”;功能“;“参数”;另一个功能的展开_C#_Function_Params - Fatal编程技术网

C# 如何养活一个“孩子”;“参数”;功能“;“参数”;另一个功能的展开

C# 如何养活一个“孩子”;“参数”;功能“;“参数”;另一个功能的展开,c#,function,params,C#,Function,Params,c语言中的两个函数# 我想在一个函数中展开“列表”,并将其发送到另一个函数。 我所说的“展开”是指将列表变成 int var1,字符串var2,int var3, 当然要知道每个参数的类型是什么 万一你问为什么?你会那样做吗?这是因为我在Unity3D网络环境之上实现了一个通用的网络实用程序,而这两个功能实际上在不同的计算机上,而Unity3D网络环境要求只发送基本类型,如“string”、“Vector3”、“double”等,所以将一个列表传递给另一个列表不会传递 只要用列表调用foo2 f

c语言中的两个函数#

我想在一个函数中展开“列表”,并将其发送到另一个函数。 我所说的“展开”是指将列表变成 int var1,字符串var2,int var3, 当然要知道每个参数的类型是什么


万一你问为什么?你会那样做吗?这是因为我在Unity3D网络环境之上实现了一个通用的网络实用程序,而这两个功能实际上在不同的计算机上,而Unity3D网络环境要求只发送基本类型,如“string”、“Vector3”、“double”等,所以将一个列表传递给另一个列表不会传递

只要用列表调用
foo2

foo2(list);
编译器现在将数组作为params数组传递(与创建一个元素数组不同)


如果首先要以某种方式计算参数,请确保在将其传递给
foo2
之前将其键入为
object[]
。很可能,您必须记录您在那里所做的工作。

当您声明
参数AnyType[]argumentName
时,C#允许您以两种方式调用它:

  • 传递数量可变的参数

    foo2(arg1, arg2, arg3)
    
  • 传递所需类型的数组

    foo2(new object[] { arg1, arg2, arg3 })
    
这意味着您可以毫无问题地将收到的参数从一个函数传递到另一个函数。。。或者,如果您想以某种方式更改数组,您可以使用linq,例如,并使用
.Cast().ToArray()
转换最终结果:

或前置:

void foo1(params System.Object[] list)
{
    foo2((new object[] { "another-param" }).Concat(list).Cast<object>().ToArray());
}
void foo1(参数系统对象[]列表)
{
foo2((新对象[]{“另一个参数”}).Concat(list.Cast().ToArray());
}

你说的“展开”是什么意思?嗯,林克,我问这个问题可能是因为我需要一种方法来展开参数列表,因为Unity3D网络只允许发送特定类型的数据。对象[]不是其中之一。linq是如何工作的?它会将列表转换为常规的逗号分隔参数吗?您是否试图将传统参数与
foo1
接收的参数一起传递到
foo2
。。。如果这就是您要完成的,那么请参阅我的编辑。否问题是foo2()不是我的函数,它不希望接收任何内容,除了基本的“string”、“Vector3”、“double”。这个列表实际上是由这些简单的类型组成的。因此,理论上可以展开第一个列表,并将其作为逗号分隔的变量发送到第二个列表。但我不认为c#是动态的。我可能要做的是循环遍历函数调用的所有可能变体。然后您可以将接收到的数组传递给
foo2
。。。不需要打开它。看看答案的开头。。。这两个语句是等价的,它们是由C#以同样的方式编译的。嗯,不起作用,好吧,不管怎么说,现在太晚了,我有截止日期,所以我不得不重新设计整个通信设计。(C风格最终总是获胜)
void foo1(params System.Object[] list)
{
    foo2(list.Where(... condition )
        .Select(... select something)
        .Cast<object>().ToArray());
}
void foo1(params System.Object[] list)
{
    foo2(list.Concat(new [] { "another-param" }).Cast<object>().ToArray());
}
void foo1(params System.Object[] list)
{
    foo2((new object[] { "another-param" }).Concat(list).Cast<object>().ToArray());
}