AsyncFixer icon indicating copy to clipboard operation
AsyncFixer copied to clipboard

`delegate Task FooAsync()` is passed a `Func<Task<T>>` hiding a bug

Open johnterickson opened this issue 3 years ago • 0 comments

This will not compile:

        delegate void Foo();
        void Call(Foo f) { f(); }
        void TestCall()
        {
            Call(() => { return true; } ); // CS8030 Anonymous function converted to a void returning delegate cannot return a value
        }

but this will:

        delegate Task FooAsync();
        Task CallAsync(FooAsync f) { return f(); }
        void TestCallAsync()
        {
            CallAsync(() => { return Task.FromResult(true); });
        }

FWIW this does throw an error:

        delegate Task FooAsync();
        Task CallAsync(FooAsync f) { return f(); }
        void TestCallAsync()
        {
            CallAsync(async () => { await Task.Yield();  return true; }); //CS8031 Async lambda expression converted to a 'Task' returning delegate cannot return a value. Did you intend to return 'Task<T>'?
        }

johnterickson avatar Jul 28 '22 18:07 johnterickson