SORU
6 Aralık 2008, CUMARTESİ


Neden't kapasiteli geri catch deneyin bloğu içinde görünebilir?

Aşağıdaki Tamam

try
{
    Console.WriteLine("Before");

    yield return 1;

    Console.WriteLine("After");
}
finally
{
    Console.WriteLine("Done");
}

*5 blok, her şey yürütme tamamlandığında (IEnumerator<T> IDisposable numaralandırma tamamlanmadan önce terk edilmiş, hatta bunu sağlamak için bir yol sağlar) çalışır.

Ama bu hiç iyi değil:

try
{
    Console.WriteLine("Before");

    yield return 1;  // error CS1626: Cannot yield a value in the body of a try block with a catch clause

    Console.WriteLine("After");
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}

Bir istisna deneyin blok içinde WriteLine bir telefonu ya da diğer tarafından atılan farz (farz). catch blok yürütme devam sorun nedir?

Elbette, verim dönüş parçası (şu anda) mümkün atmak için bir şey, ama neden bir Dur bizden olan bir kapsayan try/catch uğraşmak istisna atılır önce veya sonra bir yield return?

Güncelleme:interesting comment from Eric Lippert here - onlar zaten try/finally doğru davranışı uygulamaya yeterince sorunları var gibi görünüyor bir şey var!

EDİT: bu hata sayfasında olduğunu MSDN: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx. Sebebini açıklamıyor.

CEVAP
6 Aralık 2008, CUMARTESİ


Bu pratiklik ziyade fizibilite meselesi olduğunu düşünüyorum. Bu kısıtlama olduğu çok, çok az zamanlar vardır sanıyorumaslındaetrafında çalışmış olamaz böyle bir sorunu ancak derleyici eklenen karmaşıklık çok önemli olacaktır.

Zaten karşılaştığım bunun gibi bir kaç şey vardır:

  • Genel nitelikler olması mümkün değil varlık
  • X Y (X iç içe geçmiş bir sınıf) türetmek için X için yetersizlik
  • Yineleyici blokları oluşturulmuş sınıflar ortak alanları kullanma

Her iki durumda biraz daha fazla özgürlük elde etmek mümkün, derleyici ekstra karmaşıklık pahasına olur. Takımın yaptığı pragmatik bir seçim için hangi alkışlıyorum onları tercih ederdim biraz daha kısıtlayıcı dili ile 99.9% doğru derleyici (Evet, orada böcekler; rastladım üzerinde sadece başka bir gün) daha esnek bir dil olamaz derleme doğru.

EDİT: Burada mümkün. neden, nasıl sahte kanıt.

Bu göz önünde bulundurun:

  • Verim istisna kendisi değil parçası emin olabilirsiniz (değeri önceden hesaplamak, ve sonra sadece bir alan belirleme ve dönüyorsun ""), true
  • /A bir blok kapasiteli geri kullanmaz hangi catch hakkın var.
  • Yineleyici bloğu tüm yerel değişkenler özgürce yeni metotlara taşımak oluşturulan yazın örnek değişkenler

Şimdi dönüştürme:

try
{
    Console.WriteLine("a");
    yield return 10;
    Console.WriteLine("b");
}
catch (Something e)
{
    Console.WriteLine("Catch block");
}
Console.WriteLine("Post");

(pseudo-code çeşit):

case just_before_try_state:
    try
    {
        Console.WriteLine("a");
    }
    catch (Something e)
    {
        CatchBlock();
        goto case post;
    }
    __current = 10;
    return true;

case just_after_yield_return:
    try
    {
        Console.WriteLine("b");
    }
    catch (Something e)
    {
        CatchBlock();
    }
    goto case post;

case post;
    Console.WriteLine("Post");


void CatchBlock()
{
    Console.WriteLine("Catch block");
}

Tek çoğaltılması deneyin/catch bloğu kurma - ama bu derleyici kesinlikle yapabileceği bir şey.

Burada da bir şey kaçırmış olabilir - eğer öyleyse, lütfen bana bildirin!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Vivona

    Ben Vivona

    24 Ocak 2010
  • hockeywebcasts

    hockeywebcas

    31 EKİM 2012
  • Tinkernut

    Tinkernut

    28 Aralık 2006