SORU
17 EYLÜL 2014, ÇARŞAMBA


Nasıl olsa bir ara ekleme döngü aşırı belirsizlik gidermek?

Bu Reaktif Uzantıları parçacık (pratiklik Yoksay) göz önünde bulundurun:

return Observable.Create<string>(async observable =>
{
    while (true)
    {
    }
});

Bu Reaktif Uzantıları 2.2.5 (Rx-Ana NuGet paketini kullanarak) ile derleyin. Başarısız:

Çağrı aşağıdaki yöntemleri veya özellikleri arasındaki belirsiz hata 1: 'System.Reactive.Linq.Observable.Create<string>(System.Func<System.İObserver<string>,System.Threading.Tasks.Task<System.&;&Action gt gt;)' ve 'System.Reactive.Linq.Observable.Create<string>(System.Func<System.İObserver<string>,System.Threading.Tasks.Task>)'

Ancak, bu süre içinde break herhangi bir döngü ekleyerek derleme hata düzeltmeleri:

return Observable.Create<string>(async observable =>
{
    while (true)
    {
        break;
    }
});

Sorun Reaktif Uzantıları hiç de kolay olmadığını Rx ile işe yaramaz olmadan denemek istiyorsanız () olmadan yeniden:

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>
{
}

Reaktif Uzantıları, Neden break C yardım ekleme yapar görmezden# derleyici belirsizliği gidermek? Nasıl bu# şartname C aşırı çözümleme kuralları ile ifade edilebilir?

Visual Studio 2013 Güncelleştirme 2 4.5.1 hedefleyen kullanıyorum.

CEVAP
17 EYLÜL 2014, ÇARŞAMBA


Kolay sadece neler olduğunu vurguluyor async yanı sıra Lambda buraya çekin. Bu yöntemlerin her ikisi de geçerli ve derleme:

public static void Foo()
{
    while (true) { }
}
public static Action Foo()
{
    while (true) { }
}

Ancak, bu iki yöntem için:

public static void Foo()
{
    while (true) { break; }
}
public static Action Foo()
{
    while (true) { break; }
}

İlk derler ve ikinci değildir. Geçerli bir değer döndürmez bir kod yolu vardır.

Bu aslında while(true){} (throw new Exception();) ile birlikte ilginç bir açıklamada herhangi bir dönüş türü ile bir yöntem geçerli.

Sonsuz döngü hem de aşırı için uygun bir aday olduğunu, ne aşırı olduğu için "", bir belirsizlik, bir hata sonucu. daha iyi Olmayan sonsuz döngü uygulaması sadece derler yani aşırı çözünürlükte bir tane uygun aday var.

Tabii ki, async oyuna geri getirmek için, aslında bir şekilde burada da geçerlidir. async yöntemleri için ikisi de her zaman döndürürbir şey, Task ya Task<T>. Bir olsun "Betterness" algoritmalar için aşırı yükleme çözünürlüğü tercih edecek delegeler bu bir dönüş değeri void delegeler olduğunda lambda bu maç da, ancak senin durumunda bu iki aşırı hem de delegeler bu bir dönüş değeri, aslında bunun için async yöntemleri dönen bir Task yerine Task<T> kavramsal eşdeğer değil dönen bir değer değil dahil olan betterness algoritması. Bu nedenle olmayan uyumsuz eşdeğer hem de aşırı ilgili olsa bile belirsizlik bir hata neden olmaz.

Elbette belirtmekte fayda yazılı bir program olup olmadığını belirlemek için rasgele bir kod bloğunu asla tam bir ünlü çözülemeyen sorun, ancak, süre derleyici olamaz doğru değerlendirmek olsun her bir parçacık komple, bunu kanıtlamak, bazı basit durumlar gibi bu bir kod olacak aslında hiçbir zaman tam. Bu nedenle asla tam, ama derleyici tamamladıktan muhtemelen tedavi edecek (sen ve ben) açıkça kod yazma yolu vardır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C#

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan Flavell

    Jonathan Fla

    1 HAZİRAN 2006
  • nigahiga

    nigahiga

    21 Temmuz 2006
  • segtlim

    segtlim

    21 EKİM 2008