顯然,約束執行區域保證不適用於迭代器(可能是因爲它們是如何實現的以及所有的),但是這是一個錯誤還是設計? [請參閱下面的示例。]C#try-finally CER在迭代器中中斷嗎?
即與迭代器一起使用的CER的規則是什麼?
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;
class Program
{
static bool cerWorked;
static void Main(string[] args)
{
try
{
cerWorked = true;
foreach (var v in Iterate()) { }
}
catch { System.Console.WriteLine(cerWorked); }
System.Console.ReadKey();
}
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
unsafe static void StackOverflow()
{
Big big;
big.Bytes[int.MaxValue - 1] = 1;
}
static System.Collections.Generic.IEnumerable<int> Iterate()
{
RuntimeHelpers.PrepareConstrainedRegions();
try { cerWorked = false; yield return 5; }
finally { StackOverflow(); }
}
unsafe struct Big { public fixed byte Bytes[int.MaxValue]; }
}
(代碼大多來自here被盜。)
對於你看起來值得注意的第一個人來說......至少據我可以通過Google搜索其他參考資料得知。 –
我確實發現這個https://vmccontroller.svn.codeplex.com/svn/VmcController/VmcServices/DetectOpenFiles.cs代碼片段,其中毫無戒心的作者不會獲得他認爲他正在獲得的CER。 –
@布萊恩:哈哈,不錯。我認爲這是大多數人不經常使用的東西,而那些可能已經直觀地瞭解,而沒有真正想過的人。只是我的猜測,但。 – Mehrdad