Могут ли конструкторы быть асинхронными?

У меня есть проект, в котором я пытаюсь заполнить некоторые данные в конструкторе:

public class ViewModel
{
    public ObservableCollection<TData> Data { get; set; }

    async public ViewModel()
    {
        Data = await GetDataTask();
    }

    public Task<ObservableCollection<TData>> GetDataTask()
    {
        Task<ObservableCollection<TData>> task;

        //Create a task which represents getting the data
        return task;
    }
}

К сожалению, я получаю сообщение об ошибке:

Модификатор async недопустим для этого элемента

Конечно, если я использую стандартный метод и вызываю его из конструктора:

public async void Foo()
{
    Data = await GetDataTask();
}

он работает нормально. Точно так же, если я использую старый способ наизнанку

GetData().ContinueWith(t => Data = t.Result);

, это тоже сработает. Мне просто интересно, почему мы не можем вызвать await напрямую из конструктора. Вероятно, есть много (даже очевидных) крайних случаев и причин против этого, я просто не могу придумать ни одного. Я тоже искал объяснение, но, похоже, не нашел.

261
задан Marty Neal 14 March 2019 в 09:29
поделиться