Рассмотрим этот фрагмент Reactive Extensions (игнорируйте его практичность):
return Observable.Create<string>(async observable =>
{
while (true)
{
}
});
Это не компилируется с помощью Reactive Extensions 2.2.5 (с использованием пакета NuGet Rx-Main). Он не работает:
Ошибка 1 Вызов неоднозначен между следующими методами или свойствами: 'System.Reactive.Linq.Observable.Create <string> (System.Func < System.IObserver <string> , System.Threading.Tasks.Task < System.Action > ) 'и' System.Reactive.Linq.Observable.Create <string> (System.Func < System.IObserver <string> , System.Threading.Tasks.Task > ) '
Однако добавление break
в любом месте цикла while исправляет ошибку компиляции:
return Observable.Create<string>(async observable =>
{
while (true)
{
break;
}
});
Проблема может быть воспроизведена без Reactive Extensions вообще (проще, если вы хотите попробовать ее без использования Rx):
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("Impl not important.");
}
public static IObservable<TResult> Create<TResult>(Func<IObserver<TResult>, Task<Action>> subscribeAsync)
{
throw new Exception("Impl not important.");
}
}
public interface IObserver<T>
{
}
Игнорирование части Reactive Extensions, почему добавление break
помогает компилятору С# разрешить неоднозначность? Как это можно описать с правилами разрешения перегрузки по спецификации С#?
Я использую Visual Studio 2013 Update 2 для таргетинга 4.5.1.