C#。引用扩展方法的引用返回委托

C#. Ref returning delegate for ref extension method

我有以下扩展方法来监视变量并等待它具有给定的预期值:

        public static async Task AwaitForValue<T>(this Func<T> valueGetter, T expectedValue, int? millisecondsToAwaitBetweenChecks = null, int? maxMillisecondsToAwait = null) 
            where T : struct
        {
            var timeToAwait = millisecondsToAwaitBetweenChecks ?? 20;
            if (maxMillisecondsToAwait.HasValue)
            {
                var stopWatch = new Stopwatch();
                stopWatch.Start();
                while (!valueGetter().Equals(expectedValue) || stopWatch.ElapsedMilliseconds >= maxMillisecondsToAwait)
                {
                    await Task.Delay(timeToAwait);
                }
            }
            else
            {
                while (!valueGetter().Equals(expectedValue))
                {
                    await Task.Delay(timeToAwait);
                }
            }    
         }

工作正常:

class Foo
        {
            private bool _flag;

            public async void DoWork()
            {
                Task.Run(() =>
                {
                    Thread.Sleep(5000);
                    _flag = true;
                });
                await new Func<bool>(() => _flag).AwaitForValue(true);
                Console.WriteLine(_flag);
            }
         }

我想定义一个 ref 扩展方法,它给我一个委托 returns 我是 ref 变量的当前值,例如:

public delegate ref T RefFunc<T>();

这样我以前的扩展方法可以扩展 RefFunc<T> 而不是 Func<T> 并被消耗,假设如下:

_flag.ToRefFunc().AwaitForValue(true);

问题是我找不到正确定义 ToRefFunc<T>(this ref T value); 的方法,因为 ref 在 lambda 表达式中是不允许的。那么,有没有办法定义下面的方法呢?

public static RefFunc<T> ToRefFunc<T>(this ref T value) where T : struct
{
     //todo some day
}

理想情况下它应该是这样的:

public static RefFunc<T> ToRefFunc<T>(this ref T value) where T : struct => new RefFunc<T>(() => value);

如有任何帮助,我们将不胜感激

编辑

问题不是ref扩展方法是否被允许,从"duplicate"问题看this

编辑 2 匿名委托语法也不起作用:

public static RefFunc<T> ToRefFunc<T>(this ref T value) where T: struct
{
    return delegate { return value; }; 
}

我得到:不能在匿名方法、lambda 表达式、查询表达式或局部函数中使用 ref、out 或 in 参数 'value'

ref 参数只能在函数中使用,不能 "save for later"。那是因为 ref 参数不能使它的引用变量保持活动状态。

考虑使用引用类型(C# 说法:class)来保存数据。然后你可以拥有任意数量的句柄,它们将参与垃圾收集(对象生命周期、内存压缩等)。不幸的是,这需要更改该变量的所有用户——这不是您可以对现有对象模型中的数据进行改造的东西。