Я недавно узнал о возможности иметь настраиваемые ожидаемые типы, и, поскольку этот вопрос и Стивен Тауб , существует несколько требований, чтобы быть ожидаемым типом.
Таким образом, если тип T
хочет быть ожидаемым, он должен
- предоставить метод без параметров
GetAwaiter
, который возвращает valid awaiter
и если тип A
хочет быть действительным ожидающим, он должен
- реализовать
INotifyCompletion
интерфейс - Предоставить логическое свойство с именем
IsCompleted
- Укажите метод
GetResult
без параметров, который возвращает void
или TResult
Итак, теперь я спрашиваю, требуется ли все, чтобы быть ожидаемым типом, почему Это та часть некоторых интерфейсов, как
public interface INotifyCompletion
{
bool IsCompleted { get; }
void OnCompleted(Action continuation);
}
public interface IAwaiter : INotifyCompletion
{
void GetResult();
}
public interface IAwaitable<TAwaiter> where TAwaiter : IAwaiter
{
TAwaiter GetAwaiter();
}
public interface IAwaiter<TResult> : INotifyCompletion
{
TResult GetResult();
}
// this would probably not necessary but would likely help to identify
// awaitables that return a value
public interface IAwaitable<TAwaiter, TResult> where TAwaiter : IAwaiter<TResult>
{
TAwaiter GetAwaiter();
}
Я также понимаю, что компилятору это не нужно, поскольку он может проверять все это во время компиляции без каких-либо штрафов. Но поскольку для метода OnCompleted()
существует интерфейс INotifyCompletion
, почему остальные интерфейсы для ожидающих и ожидающих элементов не упакованы в некоторые интерфейсы?
Это, скорее всего, поможет информировать программистов, как это реализовать.
Я также знаю, что можно сделать тип ожидаемым, предоставив метод расширения, который возвращает valid awaiter, но снова почему весь интерфейс ожидающего не упакован в единый интерфейс, но имеет дыры (то есть свойство IsCompleted
не является частью какого-либо интерфейса, но требуется)?