提出这个问题最简单的方法就是通过一个例子向大家展示 - 所以我走了!
private void exampleVoid(string someString, params string[] someArray_string)
{
// Do some dirty work
for(int i = 0; i < someArray_string.length; i++)
{
Console.WriteLine(someArray_string[i]);
}
// Recall the routine
exampleVoid("some string", someArray_string)
}
当我重新传递例程底部的数组时,数据没有正常通过。数组的长度现在为0.
为什么?
答案 0 :(得分:2)
我没有使用以下示例看到这种行为:
class Program
{
static void Main( string[] args )
{
Foo( 5, "one", "two", "three" );
Console.ReadLine();
}
static void Foo( int counter, params string[] parms )
{
if( counter <= 0 ) return;
foreach( var str in parms )
{
Console.WriteLine( str );
}
Foo( --counter, parms );
}
}
在第一次递归调用后,您如何确定someArray_string
为空?你在使用调试器吗?你在哪里调用这个函数,你传递给它的是什么参数?你实际上是在传递字符串作为第二个......最后一个参数,即你是否将多个参数传递给方法?
此外,您最终会崩溃StackOverflowException
,因为除了递归调用它之外,您永远不会从函数返回。呼叫永远不会停止,这可能是你认为完全是另一个问题的原因吗?
答案 1 :(得分:1)
如何/何时初始化someArray_string?什么时候向该数组添加任何东西?据我所知,你只需循环遍历一个空数组并将其空元素写入控制台。
答案 2 :(得分:0)
您确定没有从方法中的数组中删除或修改任何数据吗?因为数组将通过引用传递。
我已经尝试了这个例子,它只是按预期工作......所以,我想知道'重处理'究竟是什么......
答案 3 :(得分:0)
我遇到了类似的问题,不得不放弃这种方法。
params关键字允许该方法采用变量参数列表。 当您再次调用该方法时,发送到下一个调用的“someArray_string”仅作为一个参数而不是数组接收。在第二次调用时,someArray_string [0]没有任何值吗?