2009-01-25 7 views
1

Un opérateur?: Très simple en C#, combiné avec un simple tableau et un appel LINQ (to Objects) à Reverse() est apparemment suffisant pour provoquer l'exception " System.Security.VerificationException: opération pourrait déstabiliser l'exécution. " lorsqu'il est exécuté sur un site Web ASP.NET en cours d'exécution avec confiance « High » (notez que « Full » est la valeur par défaut)Pourquoi simple array et Linq génèrent VerificationException: opération peut déstabiliser l'exécution

Voici le code, ainsi que la solution de contournement simple que je suis venu avec:

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 à « élevé », ce qui suit doit être ajouté au fichier web.config:

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

la solution est une fonctionnalité équivalente à la problématique: l'opérateur qui Repros le problème. Ma conjecture de la lecture des messages liés est qu'il s'agit d'un bug du compilateur C#. Quelqu'un sait ce qu'il se passe ici?

Répondre

1

Cette ligne n'a pas la question:

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

je trouve que le changement de l'ordre de l'expression fonctionne autour de la question ainsi:

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

Go figure!