簡體   English   中英

為什么異步方法返回類型不能從Task派生?

[英]Why async method return type can not be derived from Task?

我有一個班級(簡化樣本,只顯示相關部分)

public class AsyncScenario : Task<Scenario>
{
    public async AsyncScenario Test(Func<Task> action)
    {
        return await this;           
    }
}

我無法編譯這個因為方法的返回類型:

編譯器錯誤CS1983:“異步方法的返回類型必須為void,任務或任務<T>”

為什么不允許異步方法返回從Task<T>派生的類?

因為C#規范是這樣說的嗎? 沒有Eric Lippert或其他一些語言設計團隊人員 ,你不會得到更好的答案。 其他任何事情都是純粹的猜測和觀點。

也就是說,在async方法中,返回值由return語句隱含,您認為規范規則在這樣的示例中應該是什么? 顯然await this解析為一個Scenario對象...... C#編譯器應該如何從該表達式類型合成一個新的AsyncScenario對象?

我想你可能會在規范中提出一些額外的規則,這些規則可以明確地提供一些機制。 但在我看來,這些規則將顯著比存在的規范,現在矗立,這里的返回類型始終是已知的規格筆者類型和具有明確的規則,用於創建第一次該方法返回的規則更為復雜同樣重要的是,改變執行return語句的狀態。

在我看來,這些規則很可能存在,只是因為這樣做會需要過多的努力,並且會大大增加編譯器的復雜性以及所述編譯器中出現錯誤的可能性。


†說到這一點,一點點挖掘挖出金幣: 為什么異步方法必須返回任務? ,由VB.NET語言設計師Lucian Wischik編寫(但該文章同樣適用於C#)。 另請參閱Jon Skeet在使用泛型類型作為異步方法的返回類型時的答案。

您可以等待任何使用GetAwaiter方法返回類型的方法:

    public static async Task<Scenario> Test()
    {
        return await new AsyncScenario();
    }

    public class AsyncScenario
    {
        public TaskAwaiter<Scenario> GetAwaiter()
        {
            return new TaskAwaiter<Scenario>();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM