1

C# の非常に単純な ?: 演算子と、単純な配列および LINQ (オブジェクトへの) 呼び出しを組み合わせた Reverse() は、「System.Security.VerificationException: Operation could destabilize the runtime.」という例外を引き起こすのに明らかに十分です。「高」信頼で実行されている ASP.NET Web サイトで実行する場合 (「完全」がデフォルトであることに注意してください)

これがコードと、私が思いついた簡単な回避策です。

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# コンパイラのバグです。ここで何が起こっているか知っている人はいますか?

4

2 に答える 2

1

この行には問題はありません:

return test ? widgets.AsEnumerable() : widgets.Reverse();
于 2009-01-25T23:26:06.773 に答える
0

式の順序を変更すると、この問題も回避できることがわかりました。

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

図に行く!

于 2009-01-26T01:33:40.820 に答える