简体   繁体   中英

How to modify a ref variable from inside a lambda

I want to assign to a ref variable from inside a lambda. This is a simplified MRE of what I have:

public class Foo
{
    public int Value { get; private set; }
    public Foo(int value) => this.Value = value;
}

public class Test
{
    Foo F1 = new Foo(1);
    Foo F2 = new Foo(2);

    // library method, cannot change
    void LoadAsync(int value, Action<Foo> onSuccess)
    {
        // this happens async on a future frame
        Foo f = new Foo(value);
        onSuccess(f);
    }

    // my method, can change parameters and body, cannot change return type
    void LoadAndAssignAsync(int value, ref Foo fooToAssign)
    {
        LoadAsync(value, loadedFoo => fooToAssign = loadedFoo); // this is not allowed

        // because the load happens async, I cannot assign `fooToAssign` here,
        // it needs to happen inside the lambda
    }

    void Start()
    {
        LoadAndAssignAsync(11, ref F1); // I want to keep this simple
        LoadAndAssignAsync(24, ref F2);

       // I want a simple way of saying:
       // load and when done assign the result to the variable (field) I specify
    }
}

Because of the reasons shown here a lambda cannot capture a reference variable. I am looking for a simple alternate method, if it exists.

I can change and pass a lambda instead LoadAndAssign(11, result => F1 = result , but it is cumbersome, I am hoping I can keep the simple ref F1 argument.


async here means Unity's "async", aka coroutines, more specifically Addressables' AsyncOperationHandle

you can write code like:

void LoadAndAssignAsync(int value, ref Foo fooToAssign)
{
    Foo aa = null;
    LoadAsync(value, loadedFoo => aa = loadedFoo); // this is not allowed
    fooToAssign = aa;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM