C# 如何养活一个“孩子”;“参数”;功能“;“参数”;另一个功能的展开
c语言中的两个函数# 我想在一个函数中展开“列表”,并将其发送到另一个函数。 我所说的“展开”是指将列表变成 int var1,字符串var2,int var3, 当然要知道每个参数的类型是什么C# 如何养活一个“孩子”;“参数”;功能“;“参数”;另一个功能的展开,c#,function,params,C#,Function,Params,c语言中的两个函数# 我想在一个函数中展开“列表”,并将其发送到另一个函数。 我所说的“展开”是指将列表变成 int var1,字符串var2,int var3, 当然要知道每个参数的类型是什么 万一你问为什么?你会那样做吗?这是因为我在Unity3D网络环境之上实现了一个通用的网络实用程序,而这两个功能实际上在不同的计算机上,而Unity3D网络环境要求只发送基本类型,如“string”、“Vector3”、“double”等,所以将一个列表传递给另一个列表不会传递 只要用列表调用foo2 f
万一你问为什么?你会那样做吗?这是因为我在Unity3D网络环境之上实现了一个通用的网络实用程序,而这两个功能实际上在不同的计算机上,而Unity3D网络环境要求只发送基本类型,如“string”、“Vector3”、“double”等,所以将一个列表传递给另一个列表不会传递 只要用列表调用
foo2
foo2(list);
编译器现在将数组作为params数组传递(与创建一个元素数组不同)
如果首先要以某种方式计算参数,请确保在将其传递给
foo2
之前将其键入为object[]
。很可能,您必须记录您在那里所做的工作。当您声明参数AnyType[]argumentName
时,C#允许您以两种方式调用它:
- 传递数量可变的参数
foo2(arg1, arg2, arg3)
- 传递所需类型的数组
foo2(new object[] { arg1, arg2, arg3 })
.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());
}