Range运算符与Span的区别:dest[..]为何无法完成CopyTo操作?
为什么
span.CopyTo(dest[..])没能修改原数组? 问题核心出在数组范围运算符[..]的行为差异上:
- 当对数组使用
[..]时,C#会生成一个原数组内容的全新副本,而非像Span那样的内存视图。 - 所以
span.CopyTo(dest[..])实际是把数据复制到了这个临时生成的副本数组里,你的原dest数组根本没被修改,最终输出自然是初始的全0。
对比其他正确写法的逻辑:
span.CopyTo(dest):调用的是CopyTo接受T[]的重载,直接操作原数组内存,因此生效。dest.AsSpan():将数组转换为指向原内存的Span<byte>,CopyTo操作直接作用于原数组,生效。dest.AsSpan()[..]:对Span做范围切片,得到的仍是指向原数组内存的Span,复制操作同样会修改原数组。
一句话总结:数组的[..]是「复制切片」,而Span的[..]是「视图切片」,这就是导致结果不同的关键。
内容的提问来源于stack exchange,提问作者v.oddou
相关产品推荐
相关产品推荐

