Объект ожидания должен реализовать интерфейс INotifyCompletion, который обязывает реализовать метод void OnCompleted(Action continuation). Также он должен иметь экземплярные свойство bool IsCompleted, метод void GetResult(). Может быть как структурой, так и классом.
Метод GetResult () не обязательно должен возвращать void. Это может быть любой другой тип. Для примера мы можем возвращать квадрат числа над которым выполняем await:
class Program
{
static async Task Main(string[] args)
{
var pow = await 3;
Console.WriteLine(pow);
}
}
public static class WeirdExtensions
{
public static AnyTypeAwaiter GetAwaiter(this int number)
=> new AnyTypeAwaiter(number);
public class AnyTypeAwaiter : INotifyCompletion
{
private readonly int _number;
public bool IsCompleted => false;
public AnyTypeAwaiter(int number)
{
_number = number;
}
public void OnCompleted(Action continuation)
{
continuation();
}
public int GetResult()
{
return _number * _number;
}
}
}
Метод GetResult () не обязательно должен возвращать void. Это может быть любой другой тип. Для примера мы можем возвращать квадрат числа над которым выполняем await: