Passing a Span into a lambda: an alternative"

Is there any way to pass Span<T>s to a library function?

I have a library function with a fixed shape:

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

I’d like to pass in a function which requires external parameters that are Span<T>s held on the stack to avoid allocations, but Span<T>s cannot be passed as a parameter due to boxing and unboxing, and cannot be used in a generic type, passed as a params keyword, or stored in instance variables.

Is there any way to solve this problem?

Yes, you can use a ref struct to pass Span<T> to the library function. Here is an example:

public delegate double Fun(ref double x, in MySpan span);

public static void Solve(Fun f, out double y, in MySpan span) 
    double x = 1.0;
    y = f(ref x, span);

And you can define MySpan as a ref struct like this:

public ref struct MySpan 
    public readonly int Length;
    private readonly double[] _array;

    public MySpan(double[] array) 
        _array = array;
        Length = array.Length;

    public ref double this[int index] => ref _array[index];

Then you can pass an instance of MySpan to Solve method and use it in your function. Note that MySpan is a ref struct to avoid heap allocations.