鉴定为学C#不精导致的
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
点击后导向到这一行,挺常见的报错,有个地方导致a数组大小出问题了
然而,问题在于这个脚本我是移植别人写好的C++函数,可以运行理论上不可能出这种问题,C++函数如下:
我排查了很久发现问题可能在这
我修改了List a的值,打印输出了List A的值,然后发现
居然前后不一样?
那一瞬间我以为unity不区分变量的大小写,我寻思怎么会有这么逆天的事情
问了GPT后回答如下:
在GetExtra()方法中,将C[i]添加到a[i]后,List<List<double>> a = A;实际上是浅拷贝,即a和A指向同一个内存地址,所以在修改a时,实际上也修改了A。因此打印出的信息一样。要避免这种情况,可以使用深拷贝复制A到a。
GPT的回复是错的,应将代码修改如下:
public List<List<double>> GetExtra()
{
List<List<double>> a = new List<List<double>>();
foreach(var sublist in A)
{
List<double> copiedSublist = new List<double>(sublist);
a.Add(copiedSublist);
}
for (int i = 0; i < a.Count; i++)
{
Debug.Log("before="+A[i].Count);
a[i].Add(C[i]); //(N+1)*(N+1)
Debug.Log("after=" + A[i].Count);
}
return a;
}
这样,在GetExtra()方法中返回的List<List<double>> a就是一个深拷贝,修改a时不会影响原始的A。
我就花了几天草草学了一下C#后直接开干unity项目主打一个边做边学,哪懂什么浅拷贝深拷贝
或者用CopyTo(Unity&&C#学习笔记-拆装箱,List,浅深拷贝,equals和==_unity 深拷贝浅拷贝-CSDN博客)