Span<long>操作报“无法将long转换为int”错误的原因排查
问题原因及解决方案
这不是编译器的问题,核心原因是**Span<T>的索引器仅接受int类型的参数**,而你用了long类型的变量j作为索引,所以编译器会提示将long隐式转换为int的行为。
为什么Span索引用int?
Span
- 匹配CPU的内存访问指令集,避免额外的类型转换开销;
- .NET中普通数组(比如你的
long[])本身的索引上限就是int.MaxValue(约20亿),因为数组的长度参数本身就是int类型,你根本创建不了长度超过int.MaxValue的数组,所以用int索引完全覆盖实际场景。
解决方案
既然你的long[] zeroes的长度n是int类型(否则创建数组时就会报错),那startIndex和endIndex必然在int范围内,直接把循环变量j改成int类型即可:
long[] zeroes = new long[n]; long amount = 1000000; //placeholder; can be longer Span<long> segment = zeroes.AsSpan<long>(); for(int j = (int)startIndex; j <= (int)endIndex; j++) { segment[j] += amount; }
如果你的场景真的需要处理超过int.MaxValue的内存块(这种情况极少,且不能用普通.NET数组),可以通过计算偏移量,结合Span<T>.Slice方法来拆分操作,不过对于Unity开发的常规场景,上面的修改完全足够。
内容的提问来源于stack exchange,提问作者SavedByZero
相关产品推荐
相关产品推荐

