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

发布于 2024-07-11 19:38:45 字数 861 浏览 10 评论 0原文

C# 中非常简单的 ?: 运算符与简单数组和对 Reverse() 的 LINQ(对象)调用相结合,显然足以导致异常“System.Security.VerificationException:操作可能会破坏运行时的稳定性”。 当在以“高”信任运行的 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# 编译器错误。 有人知道这是怎么回事吗?

A very simple ?: operator in C#, combined with a simple array and LINQ (to Objects) call to Reverse() is apparently enough to cause the exception "System.Security.VerificationException: Operation could destabilize the runtime." when run on an ASP.NET web site running with "High" trust (note that "Full" is the default)

Here is the code, plus the straightforward workaround that I came up with:

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();
    }
}

To set the trust level to "High", the following must be added to the web.config file:

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

The workaround is functionality equivalent to the problematic ?: operator that repros the problem. My guess from reading related posts is this is a C# compiler bug. Anyone know what's going on here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

温馨耳语 2024-07-18 19:38:45

此行没有问题:

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

This line does not have the issue:

return test ? widgets.AsEnumerable() : widgets.Reverse();
我不咬妳我踢妳 2024-07-18 19:38:45

我发现改变表达式的顺序也可以解决这个问题:

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

想想看!

I found that changing the order of the expression works around the issue as well:

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

Go figure!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文