Ответ 1
async/await
- не что иное, как трансформация компилятора С# 5.0. Нет уровня async/await
на уровне IL
.
Одним простым примером может быть оператор using() { }
, который также является преобразованием компилятора. Он просто преобразует оператор using
в блок try/finally
. Тем не менее, существует зависимость от существования интерфейса IDisposable
, который определен в .NET 1.1.
Аналогично, преобразование async/await
зависит от определенных типов, таких как интерфейс IAsyncStateMachine
, которые определены в .NET 4.5. Microsoft.Bcl.Async
получает эти определения типов для .NET 4.0.
ИЗМЕНИТЬ
Как сборка Microsoft.Bcl.Async заставляет компилятор распознавать новое ключевое слово (async/wait)?
Нет, нет. Компилятор С# 5.0 уже знает о ключевых словах и что с ними делать. Однако он не может найти требуемые типы, поскольку проект предназначен для .NET 4.0. Пакет Microsoft.Bcl.Async
содержит эти типы.