您正在为参数分配一个新的引用,它不会更改实际的数组,除非您将其传递为ref
范围。由于这是一种扩展方法,因此它不是一个选项。所以考虑使用正常的方法:
public static void Add<T>(ref T[] _self, T item)
{
_self = _self.Concat(new T[] { item }).ToArray();
}
Add(ref test, "but funny");
或者,如果您坚持使用扩展方法,则需要将数组设置为第二个参数才能使用 ref:
public static void AddTo<T>(this T item, ref T[] arr, )
{
arr = arr.Concat(new T[] { item }).ToArray();
}
"but funny".AddTo(ref test);
Array.Resize
不起作用。因为它改变了_self
,不是test
大批。现在,当您传递引用类型时,无需ref
关键字,引用被复制。是这样的:
string[] arr1 = { "Hello" };
string[] arr2 = arr1;
现在,如果您分配一个新引用arr2
,它不会改变arr1
的参考。什么Array.Resize
正在做的是,由于无法调整数组大小,因此它创建一个新数组并将所有元素复制到一个新数组,并将该新引用分配给范围 (_self
在这种情况下)。所以它改变了哪里_self
指向但自从_self
and test
是两个不同的参考(例如arr1
and arr2
),更改其中一个不会影响另一个。
另一方面,如果将数组传递为ref
按照你的方法,就像我的第一个例子一样,Array.Resize
也将按预期工作,因为在这种情况下,不会复制引用:
public static void Add<T>(ref T[] _self, T item)
{
Array.Resize(ref _self, _self.Length + 1);
_self[_self.Length - 1] = item;
}