Разрываются ли CER C # в итераторах?

Очевидно, гарантии области ограниченного выполнения не применяются к итераторам (вероятно, из-за того, как они реализованы и все такое), но является ли это ошибкой или намеренно? [См. Пример ниже.]

т.е. Каковы правила использования 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 Iterate()
    {
        RuntimeHelpers.PrepareConstrainedRegions();
        try { cerWorked = false; yield return 5; }
        finally { StackOverflow(); }
    }

    unsafe struct Big { public fixed byte Bytes[int.MaxValue]; }
}

(Код в основном украден из здесь .)

18
задан Community 23 May 2017 в 12:19
поделиться