2012-10-26 9 views
15

otrzymuję następujący błąd kompilacji z ccrewrite podczas korzystania Code Contracts 1.4.51019.0 w VS2012 na Windows 7 x64: „metoda lub operacja nie jest zaimplementowana. " Kontrakty Code + asynchroniczny w .NET 4.5: „Metoda lub operacja nie jest realizowany”

wydaje się być powodowane przez połączenie udostępniające właściwości i wykorzystania async metod, które nie posiadają wewnętrzną await.

etapy reprodukcji:

utworzyć nową klasę bibliotekę z 'full' Runtime umowy sprawdzanie włączone:

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; } 
    } 
} 

Czy ktoś doświadczył tego?

+0

Usunięcie modyfikatora "asynchronicznego" rozwiązuje problem, jak sądzę? –

+0

Tak (z wyjątkiem tego, że trzeba będzie zwrócić zadanie). –

+2

To jest projekt Mike'a Barnetta. Lubi otrzymywać pocztę e-mail, więc nie wahaj się zapytać go o ten błąd. mbarnett _at_ microsoft _dot_ com –

Odpowiedz

2

Wygląda na to, że został naprawiony w wersji 1.5 kontraktów kodu.

+0

Bear Ladton;) –

0

Uważam, że słowo asynchroniczne oznacza to - albo oczekujesz podczas kodu, przez co zostanie wygenerowane zadanie i obsługiwane, gdy metoda zostanie wywołana, albo musisz zwrócić zadanie jawnie.

+2

Z pewnością * może * mieć ' metoda asynchroniczna bez 'czekania'. Zwykle oznacza to, że autor kodu nie rozumie, jak działa 'async' (i z tego powodu generuje ostrzeżenie), ale działa i wydaje mi się, że może być przydatny w rzadkich przypadkach. – svick

+0

Istnieją również inne subtelne różnice. Na przykład wyjątek wygenerowany z metody asynchronicznej będzie zawsze stosowany do zadania i nigdy nie będzie podnosić synchronicznie. –

2

Metoda async, która nie ma wartości await, zwykle wskazuje na błąd programowania. Jest ostrzeżenie o kompilatorze, które poinformuje cię o tej sytuacji.

Jeśli chcesz synchronicznie wdrożenie metody z podpisem asynchronicznym normalny sposób, aby to zrobić jest wdrożenie metody niebędącą async i zwrócić Task, takiego jak Task.FromResult<object>(null). Zauważ, że dzięki temu podejściu wyjątki są podnoszone synchronicznie, zamiast umieszczane na zwróconych Task.

+2

Tak, ale to nie wyjaśnia błędu Code Contracts. – svick

+1

Jestem świadomy jego poprawnego użycia i masz rację, mówiąc, że poprawianie kodu asynchronicznego rozwiązuje problem. Wciąż jest to jednak błąd Code Contracts :) –

1

W ciągu ostatnich kilku miesięcy naprawiliśmy wiele problemów związanych z przepisywaniem metod asynchronicznych. Sugeruję ponowne wypróbowanie kodu na najnowszym instalatorze, a jeśli nadal masz problem, prześlij kompletną repro.

Powiązane problemy