Aşağıdakiler tamamdır:
try
{
Console.WriteLine("Before");
yield return 1;
Console.WriteLine("After");
}
finally
{
Console.WriteLine("Done");
}
finally
Blok şeyi yürütme tamamlandığında (ishal IEnumerator<T>
destekleri IDisposable
tamamlanmadan önce numaralandırma terk dahi Bunu sağlamak için bir yol sağlamak için).
Ama bu doğru 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);
}
Deneme WriteLine
bloğu içindeki çağrılardan biri veya daha fazlası tarafından bir istisna atıldığını varsayalım (argüman uğruna) . Yürütmeye catch
blok halinde devam etmenin sorunu nedir ?
Elbette, getiri getirisi kısmı (şu anda) hiçbir şey atamıyor, ancak bu, neden bir kapsama sahip olmamızı try
/ catch
a'dan önce veya sonra atılan istisnalarla uğraşmamızı engellesin yield return
?
Güncelleme: Burada Eric Lippert'ten ilginç bir yorum var - görünüşe göre dene / nihayet davranışını doğru bir şekilde uygulamak için yeterince sorun yaşıyorlar!
DÜZENLEME: Bu hatayla ilgili MSDN sayfası: http://msdn.microsoft.com/en-us/library/cs1x15az.aspx . Yine de nedenini açıklamıyor.