ref
パラメータ宣言に追加してみてください。これで、期待どおりに動作するはずです。
ref
への呼び出しがなければ、Array.Resize
ローカル配列参照のみを変更でき、から渡された参照は変更できませんMain
。
static void Main(string[] args)
{
string str = "Hello";
var array = str.ToArray();
PrintReverse(ref array);
Console.Read();
Debug.Assert(array.Length == 0);
}
static void PrintReverse(ref char[] Chars)
{
Console.Write(Chars[Chars.Length - 1]);
Array.Resize(ref Chars, Chars.Length - 1);
if (Chars.Length == 0) return;
PrintReverse(ref Chars);
}
編集:
私は ref が浅いクローンを引き起こすと誤解していました。これがその証拠です:
static void Main(string[] args)
{
var array = new[] { new object() };
TestRef(ref array, array);
}
static void TestRef(ref object[] arrayByRef, object[] arrayByValue)
{
Debug.Assert(ReferenceEquals(arrayByRef, arrayByValue)); //no difference whether passed by ref or value, if there was a shallow clone happening, this would fail
Array.Resize(ref arrayByRef, 2);
Debug.Assert(!ReferenceEquals(arrayByRef, arrayByValue)); //only now do they differ
}