Pourquoi un tableau simple et Linq génèrent-ils une VerificationException: l'opération pourrait déstabiliser le moteur d'exécution

StackOverflow https://stackoverflow.com/questions/478422

Question

Un opérateur très simple?: en C #, associé à un tableau simple et à l'appel LINQ (to Objects) de Reverse () est apparemment suffisant pour provoquer l'exception & "System.Security.VerificationException: Une opération pourrait déstabiliser le runtime. " lorsqu’il est exécuté sur un site Web ASP.NET fonctionnant avec " Élevé " confiance (notez que " Complet " est la valeur par défaut)

Voici le code, plus la solution de contournement simple que j'ai trouvée:

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

Pour définir le niveau de confiance sur & "High &", vous devez ajouter les éléments suivants au fichier web.config:

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

La solution de contournement est une fonctionnalité équivalente à l'opérateur problématique?: qui reproduit le problème. D'après ce que j'ai lu dans les publications, c'est un bogue du compilateur C #. Quelqu'un sait ce qui se passe ici?

Était-ce utile?

La solution

Cette ligne n'a pas le problème:

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

Autres conseils

J'ai constaté que le fait de changer l'ordre des expressions corrigeait également le problème:

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

Allez comprendre!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top