我碰到了這個C#編譯器錯誤,雖然我確定編譯器不能推斷lambda的類型,但錯誤消息看起來不對。下面是相關的代碼:異步lambda類型推斷錯誤的C#編譯器錯誤信息
Func<object> lambda = async() => { return await Task.FromResult(1); };
和這裏的編譯器錯誤:
error CS4010: Cannot convert async lambda expression to delegate type '
System.Func<object>
'. An async lambda expression may returnvoid
,Task
orTask<T>
, none of which are convertible to 'System.Func<object>
'.
我不太明白的部分是最後一句。 lambda確實返回Task<int>
,但爲什麼編譯器認爲它應該嘗試將其轉換爲System.Func<object>
?另一方面,如果錯誤信息試圖傳達的是System.Func<Task<int>>
不能被分配給System.Func<object>
,但似乎並不是這種情況,這要歸功於泛型委託協方差,這意味着它可以正常工作:
Func<object> lambda = new Func<Task<int>>(async() => { return await Task.FromResult(1); });
編譯器應該將它轉換爲'System.Func
*異步方法的返回類型必須爲空,任務或任務 * –