替代使用Func返回Span 或其他ref struct [重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

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

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

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

c# html system.memory
1个回答
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>这样的语法。

这里对泛型类型参数的限制是不同的:即使没有“ref”修饰符,也没有像Func<MyRefStruct>Func<MyRefStruct, object>这样的语法。这不是因为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

请注意,如果不是ref struct MyRefStruct,我们有一个structclass称为MyType,那么就不需要一个类似于MyRefStructAction的代表;人们可以简单地使用Action<MyType>。同样,可以使用Func<MyType>返回MyType。只有随着ref structs的出现,在传递一个按值传递参数或按值返回的方法时,才需要使用委托。

© www.soinside.com 2019 - 2024. All rights reserved.