MsCorLib中Array.Sort的Span代码在.NET7/C#11编译报错的解决问询
编译错误原因及解决办法
错误原因
.NET运行时内部的Array.Sort<T>属于核心信任代码,编译时会启用普通项目没有的特殊语法豁免规则。而在常规C#项目中,语法明确禁止直接将方法返回的ref值作为ref参数传递给其他方法或构造函数——MemoryMarshal.GetArrayDataReference(array)返回的是ref T,直接带ref传给Span<T>构造函数违反了C#的常规语法约束,因此触发编译错误。
解决办法
方法1:用临时变量持有ref值
将MemoryMarshal.GetArrayDataReference返回的ref值赋值给可读写的ref变量,再传递给Span<T>构造函数,符合C#语法要求:
ref T arrayDataRef = ref MemoryMarshal.GetArrayDataReference(array); var span = new Span<T>(ref arrayDataRef, array.Length);
方法2:使用官方推荐的数组转Span方式
如果需求只是将数组转换为Span<T>,无需手动调用底层构造函数,直接使用框架提供的隐式转换或AsSpan()方法即可,这是最简洁安全的写法:
// 隐式转换 Span<T> span = array; // 或者调用AsSpan方法 var span = array.AsSpan();
内容的提问来源于stack exchange,提问作者Marco Levarato
相关产品推荐
相关产品推荐

