2012-10-26 61 views
15

在Windows 7 x64的VS2012中使用代碼契約1.4.51019.0時,我從ccrewrite收到以下編譯錯誤:「The method or操作未實現。「 .NET 4.5中的代碼合同+異步:「方法或操作未實現」

它似乎是由屬性訪問的組合和使用的方法async缺乏內await引起。

繁殖步驟:

創建一個新的類庫與 '滿' 運行合同檢查功能:

namespace CodeContractsAsyncBug 
{ 
    using System.Threading.Tasks; 

    public class Service 
    { 
     // Offending method! 
     public async Task ProcessAsync(Entity entity) 
     { 
      var flag = entity.Flag; 
     } 
    } 

    public class Entity 
    { 
     public bool Flag { get; set; } 
    } 
} 

有其他人遇到此?

+0

刪除「異步」修改器修復了這個問題,我想? –

+0

是的(除非你需要返回一個任務)。 –

+2

這是Mike Barnett的項目。他喜歡收到電子郵件,所以不要猶豫,讓他知道這個錯誤。 mbarnett _at_ microsoft _dot_ com –

回答

2

這似乎是在代碼合同1.5版中修復的。

+0

拉丁頓熊;) –

0

我相信async關鍵字只是代表 - 要麼在代碼期間等待,通過它將生成一個任務並在調用該方法時處理,或者您需要顯式返回一個任務。

+2

你當然* *可以*不帶'await'的異步方法。它通常意味着代碼的作者不明白'async'是如何工作的(並且由於這個原因會產生警告),但它確實有效,我認爲它在一些極少數情況下可能會有用。 – svick

+0

還有一些其他的細微差別。例如,從異步方法拋出的異常將始終應用於該任務,並且永遠不會同步提升。 –

2

async方法不await通常表示編程錯誤。有一個編譯器警告會告訴你這種情況。

如果您希望同步實現具有異步簽名的方法,則正常執行此操作的方法是實現非async方法並返回Task,例如​​。請注意,採用這種方法時,異常會同步提升,而不是放在返回的Task上。

+2

是的,但是這並不能解釋代碼合同錯誤。 – svick

+1

我知道它的正確使用方法,你說的修正非異步代碼可以解決問題是正確的。它仍然是代碼合同錯誤,但是:) –

1

在過去的幾個月中,我們修復了重寫異步方法的許多問題。我建議你在最新的安裝程序上再次嘗試你的代碼,如果你仍然有問題,請提供一個完整的repro。