如何将返回 Span 的方法作为参数传递?
using System.Memory;
public Span<byte> CallSpanFactory1(Func<Span<byte>> spanFactory)
{
return spanFactory();
}
此代码返回错误“类型 'Span' 可能不用作类型参数”(这是有道理的,因为使用 ref 结构作为泛型类型参数可能导致装箱,因此被禁止)。
如何将返回 Span 的方法作为参数传递?
using System.Memory;
public Span<byte> CallSpanFactory1(Func<Span<byte>> spanFactory)
{
return spanFactory();
}
此代码返回错误“类型 'Span' 可能不用作类型参数”(这是有道理的,因为使用 ref 结构作为泛型类型参数可能导致装箱,因此被禁止)。
这是一种必须使用委托而不能使用 Func 或 Action 的情况。
using System.Memory;
public delegate Span<byte> SpanFactoryFunc();
public Span<byte> CallSpanFactory(SpanFactoryFunc spanFactory)
{
return spanFactory();
}
由于泛型类型参数的限制,还有其他情况必须使用委托。这个问题确定了一种这样的情况——希望将包含通过引用传递的参数的方法作为参数传递。这不能用 Func 或 Action 来实现,因为不存在 ref 泛型类型参数之类的东西。没有像Func<ref float, object>
.
这里对泛型类型参数的限制是不同的:没有类似Func<MyRefStruct>
甚至Func<MyRefStruct, object>
没有“ref”修饰符的语法。这不是因为MyRefStruct
将始终通过引用隐式传递。Ref 结构并不总是通过引用隐式传递。它们可以通过引用或值传递。类似地,ref 结构并不总是作为“ref 返回”返回。
因此,委托的形式很重要——以下两个委托将产生不同的效果:
public ref struct MyRefStruct
{
// ...
}
public delegate void MyRefStructMutator(ref MyRefStruct s); // s is passed by reference
public delegate void MyRefStructAction(MyRefStruct s); // s is passed by value
ref struct MyRefStruct
请注意,如果我们使用 astruct
或 a来代替,class
则MyType
不需要类似于MyRefStructAction
;的委托。可以简单地使用Action<MyType>
. 同样,可以使用Func<MyType>
返回 MyType。只有随着ref struct
s 的出现,在传递按值传递参数或按值返回的方法时,才需要使用委托。