Возвращаемое значение и точность подписи при назначении делегатам - Func<Task> vs Action
Я был удивлен, обнаружив, что возвращаемый тип метода может создать неоднозначность перегрузки при передаче метода другому методу. Так как тип возвращаемого значения не является частью сигнатуры, трудно понять, как изменение возвращаемого значения может создать неопределенность там, где его ранее не существовало. Все же это, кажется, имеет место для пустоты и Задачи. Учтите следующее:
class Signature
{
static public void Overload(Func<Task> countasync)
{
}
static public void Overload(Action count)
{
}
}
void Decrement() { }
Task IncrementAsync() { return Task.CompletedTask; }
void TestSig()
{
Signature.Overload(this.IncrementAsync); // no compile time error
Signature.Overload(this.Decrement); // compile time error: this call is ambiguous
}
Есть ли способ определить типы аргументов Overload, чтобы второй вызов не был неоднозначным, и в то же время разрешать первый вызов?
1 ответ
Решение
Нет, нет способа исправить разрешение перегрузки.
Но вы можете устранить неоднозначность за счет немного более уродливого вызова кода сайта:
Signature.Overload( () => this.Decrement() );
В этом случае компилятор правильно выведет перегрузку.