Jon réponse est bonne. Je veux suivre sur Jon commentaire:
Je peux voir que si vous pouvez construire que l'expression de la programmation, qui vous permettra de contourner normal polymorphisme de l'extérieur plutôt que seulement à partir de l'intérieur de la classe elle-même (ce qui est le cas normal). C'est peut être la raison
Supposons que vous avez
public abstract class B // Prevent instantiation
{
internal B() {} // Prevent subclassing outside the assembly.
public virtual void Dangerous() { ... }
}
public sealed class D : B
{
public override void Dangerous()
{
if (!Allowed()) throw whatever;
base.Dangerous();
}
Il devrait y avoir aucun moyen pour que partiellement le code de confiance avec un D
dans la main pour appeler B.Dangerous
sur l'instance de D
sans faire la vérification de la sécurité en D.Dangerous
.
Le vérificateur CLR donc de restreindre vous d'effectuer une non-virtuel invocation (une base de l'invocation est bien sûr non virtuelle) sur une méthode virtuelle de l'extérieur de la hiérarchie de classe. En fait, il va même plus loin; on ne peut même pas réaliser qu'à partir d'une classe imbriquée dans D
! (Bien sûr, si votre programme est accordé le droit d'ignorer la vérification puis vous pouvez faire ce que vous voulez; vous pouvez déréférencement arbitraire des pointeurs vers la mémoire dans invérifiable code qui est bien pire que de faire un appel statique sur une méthode virtuelle.)
Lors de la conception des arbres d'expression, nous ne voulons pas traiter avec ce désordre problème de sécurité. La meilleure chose à faire est de simplement faire de l'ensemble de chose illégale.
Il y avait un certain nombre d'autres problèmes de sécurité avec des arbres d'expression qui ne pouvait pas être facilement résolu, mais ceux qui sont un sujet pour un autre jour.