Если бы эти две строки были эквивалентны:
string s = await File.ReadAllTextAsync(); // Current syntax
string s = File.ReadAllText(); // Proposed syntax
... тогда мы больше не смогли бы создать Task
, не ожидая его немедленно. Таким образом, мы не могли сделать все эти классные кадры с Task.WhenAll
, Task.WhenAny
и т. Д., Которые допускают параллелизм. Затем нам потребуется другое ключевое слово для обозначения не ожидающего, например:
var s = defer File.ReadAllText(); // s is Task<string>
Или выведите его по типу возвращаемой переменной:
Task<string> s = File.ReadAllText(); // defer is inferred
Любой метод, содержащий строкуstring s = File.ReadAllText();
теперь будет неявно асинхронным, поэтому он должен вернуть Task
. Для обеспечения согласованности и упрощения работы разработчиков, вероятно, следует разрешить сохранять развернутые типы в сигнатуре. Пример эквивалентного текущего и предлагаемого синтаксиса:
public async Task<string> GetData() => await File.ReadAllTextAsync(); // Current syntax
public string GetData() => File.ReadAllText(); // Proposed syntax
Я не уверен, насколько далеко вы можете пойти в этом эксперименте. Я предполагаю, что если бы async
/ await
было введено вместе с библиотекой TPL, вы могли бы пройти несколько миль, прежде чем столкнуться с препятствием. Но так как TPL (2010) предшествовал async
/ await
(2012), уже было много API, выставляющих тип Task
, и множество кода, использующего эти API, уже сломанного с новым синтаксисом.