为什么简单数组和Linq生成VerificationException:操作可能会破坏运行时的稳定性

时间:2009-01-25 22:23:56

标签: c# asp.net linq linq-to-objects medium-trust

C#中一个非常简单的?:运算符,结合一个简单数组和LINQ(对象)调用Reverse()显然足以导致异常“System.Security.VerificationException:Operation可能会破坏运行时的稳定性”。在以“高”信任运行的ASP.NET网站上运行时(请注意“完整”是默认值)

以下是代码,以及我提出的简单解决方法:

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 个答案:

答案 0 :(得分:1)

这一行没有问题:

return test ? widgets.AsEnumerable() : widgets.Reverse();

答案 1 :(得分:0)

我发现改变表达式的顺序也适用于这个问题:

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

去图!