mba*_*amo 5 html c# system.memory
如何将返回 Span 的方法作为参数传递?
using System.Memory;
public Span<byte> CallSpanFactory1(Func<Span<byte>> spanFactory)
{
return spanFactory();
}
Run Code Online (Sandbox Code Playgroud)
此代码返回错误“类型‘Span’不能用作类型参数”(这是有道理的,因为使用 ref 结构作为泛型类型参数可能会导致装箱,因此被禁止)。
在这种情况下,必须使用委托,而不能使用 Func 或 Action。
using System.Memory;
public delegate Span<byte> SpanFactoryFunc();
public Span<byte> CallSpanFactory(SpanFactoryFunc spanFactory)
{
return spanFactory();
}
Run Code Online (Sandbox Code Playgroud)
在其他情况下,由于泛型类型参数的限制,必须使用委托。这个问题确定了一种这样的情况——人们希望将一个方法作为参数传递,该方法包含通过引用传递的参数。这无法通过 Func 或 Action 来完成,因为不存在 ref 泛型类型参数之类的东西。没有类似的语法Func<ref float, object>。
这里对泛型类型参数的限制是不同的:没有类似Func<MyRefStruct>甚至Func<MyRefStruct, object>没有“ref”修饰符的语法。这不是因为MyRefStruct总是通过引用隐式传递。Ref 结构并不总是通过引用隐式传递。它们可以通过引用或值传递。同样,ref 结构并不总是作为“ref returns”返回。
由此可见,委托的形式很重要——以下两个委托将产生不同的效果:
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
Run Code Online (Sandbox Code Playgroud)
请注意,如果ref struct MyRefStruct我们没有调用astruct或 a ,则不需要类似于 的委托;人们可以简单地使用. 类似地,可以使用返回 MyType。只是随着s 的出现,在传递按值传递参数或按值返回的方法时,使用委托才变得有必要。classMyTypeMyRefStructActionAction<MyType>Func<MyType>ref struct