Почему простой массив и Linq генерируют VerificationException: операция может дестабилизировать среду выполнения - PullRequest
1 голос
/ 26 января 2009

Очень простой оператор?: В C # в сочетании с простым массивом и LINQ (to Objects), вызов Reverse (), по-видимому, достаточно для исключения «System.Security.VerificationException: операция может дестабилизировать среду выполнения». при запуске на веб-сайте ASP.NET, работающем с доверием «High» (обратите внимание, что по умолчанию «Full»)

Вот код, плюс простой обходной путь, который я придумал:

protected void Page_Load(object sender, EventArgs e) {
    Repro();
    //Workaround();
}

private IEnumerable<string> Repro() {
    bool test = true;
    string[] widgets = new string[0];
    return test ? widgets : widgets.Reverse();
}

private IEnumerable<string> Workaround() {
    bool test = true;
    string[] widgets = new string[0];
    if (test) {
        return widgets;
    } else {
        return widgets.Reverse();
    }
}

Чтобы установить уровень доверия «Высокий», в файл web.config необходимо добавить следующее:

<trust level="High" originUrl=""/>

Обходной путь - это функциональность, эквивалентная проблематическому оператору?:, Который воспроизводит проблему. Я думаю, что читая похожие посты, это ошибка компилятора C #. Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

1 голос
/ 26 января 2009

Эта строка не имеет проблемы:

return test ? widgets.AsEnumerable() : widgets.Reverse();
0 голосов
/ 26 января 2009

Я обнаружил, что изменение порядка выражения также помогает решить эту проблему:

private IEnumerable<string> Workaround() {
    bool test = true;
    string[] widgets = new string[0];
    return !test ? widgets.Reverse() : widgets;
}

Иди цифра!

...