替代使用Func返回Span <t>或其他ref结构

时间:2018-03-05 21:57:19

标签: c# html system.memory

如何将返回Span的方法作为参数传递?

using System.Memory;   
public Span<byte> CallSpanFactory1(Func<Span<byte>> spanFactory)
{
    return spanFactory();
}

此代码返回错误“类型'Span'不能用作类型参数”(这是有道理的,因为使用ref结构作为泛型类型参数可能导致装箱,因此被禁止)。

1 个答案:

答案 0 :(得分:2)

这是一个必须使用委托并且不能使用Func或Action的情况。

using System.Memory;
public delegate Span<byte> SpanFactoryFunc();

public Span<byte> CallSpanFactory(SpanFactoryFunc spanFactory)
{
    return spanFactory();
}

由于泛型类型参数的限制,还有一些必须使用委托的情况。 This question标识了一种这样的情况 - 其中一个希望作为参数传递一个方法,该方法包括通过引用传递的参数。使用Func或Action无法实现这一点,因为没有ref泛型类型参数。没有像Func<ref float, object>这样的语法。

这里对通用类型参数的限制是不同的:即使没有&#34; ref&#34;也没有Func<MyRefStruct>Func<MyRefStruct, object>之类的语法。修改。这不是因为MyRefStruct将始终通过引用隐式传递。 Ref结构并不总是通过引用隐式传递。它们可以通过引用或值传递。类似地,ref结构并不总是返回为&#34; ref返回&#34;。

因此,代表的形式很重要 - 以下两位代表将产生不同的影响:

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,我们有一个名为struct的{​​{1}}或class,则不需要类似{{1}的委托}};一个人可以简单地使用MyType。同样,可以使用MyRefStructAction返回MyType。只有Action<MyType>的出现才会在传递一个按值传递参数或按值返回的方法时使用委托变得必要。