在 MsCorLib Array.cs 源文件中,第 1941 行有以下方法:
void Sort<T>(T[] array)
在第 1948 行的正文块中有以下行
var span = new Span<T>(ref MemoryMarshal.GetArrayDataReference(array), array.Length);
如果我尝试使用 C# 11 和 .NET 7 在我的项目中复制粘贴此行,则会出现编译错误“参数 1 可能无法通过‘ref’关键字传递”
这怎么可能?我必须做什么才能编译这一行?
它使用不公开的内部
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
在您的代码中,编译器只有带有 2 个可用参数的 ctor -
Span<T>(Void*, Int32)
,它需要指针,而不是 ref
参数,因此会出现编译错误。