В принципе, несложно, но на форуме затишье, так что и такое сойдёт
Итак,
1
class Program
{
static void Main(string[] args)
{
Observable.Create<string>(async blah =>
{
while (true)
{
Console.WriteLine("foo.");
break; //Remove this and the compiler will break
}
});
}
}
public class Observable
{
public static IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, Task> subscribeAsync)
{
throw new Exception("Method1.");
}
public static IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, Task<Action>> subscribeAsync)
{
throw new Exception("Method2.");
}
}
public interface IObserver<T>
{
}
2. Убираем "break;" — получаем ошибку компиляции
The call is ambiguous between the following methods or properties:
'ConsoleApplication1.Observable.Create<string>(System.Func<ConsoleApplication1.IObserver<string>,System.Threading.Tasks.Task>)'
and
'ConsoleApplication1.Observable.Create<string>(System.Func<ConsoleApplication1.IObserver<string>,System.Threading.Tasks.Task<System.Action>>)'
3. Объяснение —
по ссылке, но и самому догадаться несложно.
4. Чтоб было веселее:
4.1 — заменить break на любую инструкцию так, чтобы код компилировался, но бросалось исключение с текстом "Method2".
4.2 — изменить только сигнатуру Create так, чтобы с break вызывался вариант "Method1", без — "Method2".