3

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

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

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

4

1 回答 1

3

这是一种必须使用委托而不能使用 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来代替,classMyType不需要类似于MyRefStructAction;的委托。可以简单地使用Action<MyType>. 同样,可以使用Func<MyType>返回 MyType。只有随着ref structs 的出现,在传递按值传递参数或按值返回的方法时,才需要使用委托。

于 2018-03-05T21:57:19.157 回答