Pourquoi un tableau simple et Linq génèrent-ils une VerificationException: l'opération pourrait déstabiliser le moteur d'exécution
-
20-08-2019 - |
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?
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!