Visual Studio MsCorLib Array.cs数组,对无法编译的代码行进行排序

ss2ws0br  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(79)

在MsCorLib Array.cs源文件中,在第1941行有以下方法:

void Sort<T>(T[] array)

在第1948行的主体块中,有以下行

var span = new Span<T>(ref MemoryMarshal.GetArrayDataReference(array), array.Length);

如果我尝试在我的项目中复制粘贴这行代码,使用C#11和.NET7,会出现编译错误“参数1可能无法与'ref'关键字一起传递”
这怎么可能?我需要做什么来编译这行代码?

cl25kdpy

cl25kdpy1#

它使用内部Span<T>构造函数,该构造函数不是公开可用的:

#pragma warning disable IDE0060 // https://github.com/dotnet/roslyn-analyzers/issues/6228
// Constructor for internal use only. 
// It is not safe to expose publicly, 
// and is instead exposed via the unsafe MemoryMarshal.CreateSpan.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal Span(ref T reference, int length)
{
    Debug.Assert(length >= 0);
 
    _reference = ref reference;
    _length = length;
}
#pragma warning restore IDE0060 // https://github.com/dotnet/roslyn-analyzers/issues/6228

因此,“外部”编译器只有ctor和2个参数可用-Span<T>(Void*, Int32)需要指针,而不是ref参数,因此编译错误。
正如在源代码中的注解中提到的-您可以使用MemoryMarshal.CreateSpan作为替代。

相关问题