semihokur / AsyncFixer

Advanced async/await Diagnostics and CodeFixes for C#
Apache License 2.0
165 stars 11 forks source link

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

Open johnterickson opened 2 years ago

johnterickson commented 2 years ago

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>'?
        }