Ответ 1
Это, по-видимому, исправлено в версии 1.5 кодовых контрактов.
Я получаю следующую ошибку компиляции ccrewrite при использовании Code Contracts 1.4.51019.0 в VS2012 в Windows 7 x64: "Метод или операция не реализованы."
Похоже, что это вызвано комбинацией аксессуаров свойств и использованием методов async
, у которых отсутствует внутренний await
.
Действия по воспроизведению:
Создайте новую библиотеку классов с включенной проверкой контракта "Полный" Runtime Contract:
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; }
}
}
Кто-нибудь еще испытал это?
Это, по-видимому, исправлено в версии 1.5 кодовых контрактов.
Метод async
, который не await
обычно указывает на ошибку программирования. Существует предупреждение о компиляторе, которое сообщит вам об этой ситуации.
Если вы хотите синхронно реализовать метод с асинхронной подписью, нормальный способ сделать это - реализовать метод не async
и вернуть Task
, например Task.FromResult<object>(null)
. Обратите внимание, что при таком подходе исключения генерируются синхронно вместо того, чтобы помещаться в возвращаемый Task
.
За последние несколько месяцев мы устранили многие проблемы с переписыванием асинхронных методов. Я бы посоветовал вам снова попробовать свой код в последнем инсталляторе, и если у вас все еще есть проблемы, предоставьте полный реестр.
Я считаю, что ключевое слово async просто означает это - либо у вас есть ожидание во время кода, с помощью которого он будет сгенерирован Task и обработан при вызове метода, либо вам нужно явно вернуть задачу.