我有一个这种形状的函数,可以进行一维求根:
public delegate double Fun(double x, object o);
public static void Solve(Fun f, out double y, object o)
{
y = f(1.0, o); // all the irrelevant details of the algorithm omitted
}
这是一个固定的形状,以便使算法可重用。将此视为我无法更改的固定库函数(或者至少需要保持通用性和可重用性,并且不会针对此问题的具体情况进行更改)。
我想传递一个需要外部参数的函数Span<T>
保留在堆栈上以避免分配,但显然不能推送Span<T>
s 进入对象,因为这需要装箱和拆箱。
使用 lambda 表达式,调用代码可能类似于:
void CallingMethod()
{
Span<double> k1 = stackalloc double[n];
double answer;
Solve((x, o) => Wrapper(x, k1, o), out answer, null);
}
double Wrapper(double x, ReadOnlySpan<double> k1, object o)
{
return <some function of x and k1>;
}
但这不起作用,因为你无法形成闭包Span<T>
s 带有 lambda 表达式。它们也不能在泛型类型中使用,任何装箱和拆箱都已取消,不能作为 params 关键字传递,不能用于实例变量等。
有什么办法可以解决这个问题吗?
只是为了强调这个例子过于简单了。我可能有一个 Span,但我目前正在解决的问题需要传递 4 个 Span。我需要为任意数量的人进行设计。