considerare questo Extensions reattivi snippet (ignorare la praticità di esso):In che modo l'aggiunta di un'interruzione in un ciclo while risolve l'ambiguità di sovraccarico?
return Observable.Create<string>(async observable =>
{
while (true)
{
}
});
Questo non viene compilato con reattivi Extensions 2.2.5 (utilizzando il pacchetto NuGet Rx-Principale). Viene a mancare con:
Error 1 The call is ambiguous between the following methods or properties: 'System.Reactive.Linq.Observable.Create<string>(System.Func<System.IObserver<string>,System.Threading.Tasks.Task<System.Action>>)' and 'System.Reactive.Linq.Observable.Create<string>(System.Func<System.IObserver<string>,System.Threading.Tasks.Task>)'
Tuttavia, l'aggiunta di un break
in qualsiasi parte del ciclo while correzioni l'errore di compilazione:
return Observable.Create<string>(async observable =>
{
while (true)
{
break;
}
});
Il problema può essere riprodotta senza reattivi estensioni a tutti (più facile se si vuole provare senza giocherellare con 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>
{
}
Ignorando la parte estensioni reattivi di esso, perché l'aggiunta break
aiuto del compilatore C# determinazione l'ambiguità? Come può essere descritto con le regole della risoluzione di sovraccarico dalla specifica C#?
Sto utilizzando Visual Studio 2013 Update 2 targeting 4.5.1.
@ Mic1780: da quando i compilatori non riescono a rilevare un ciclo infinito? Mai visto prima ... – knittl
@ Mic1780 Non ho idea di cosa tu stia parlando. Il compilatore C# (in realtà, la maggior parte dei compilatori) compilerà felicemente un ciclo infinito, anche uno semplice come 'while (true) {}' – tnw