2009-04-17 6 views
13

Le compilateur C# semble noter explicitement toutes les interfaces et ses classes de base implémentent. Les spécifications CLI disent que ce n'est pas nécessaire. J'ai vu d'autres compilateurs ne pas l'exprimer explicitement, et cela semble fonctionner correctement. Y at-il une différence ou une raison pour laquelle le C# fait cela?Pourquoi le compilateur C# déclare-t-il explicitement toutes les interfaces implémentées par un type?

Le MSIL que le C# au fond génère B est:

.class private auto ansi beforefieldinit B 
     extends A 
     implements IAdvanced, 
        ISimple 

Il ne devrait pas avoir besoin de spécifier ISimple, parce qu'elle met en œuvre A tout comme IAdvanced. C# Code:

interface ISimple { 
    int Basic { get; } 
    int Zero { get; } 
} 
interface IAdvanced : ISimple { 
    string Major { get; } 
} 
class A : ISimple { 
    int ISimple.Basic { 
     get { return 1; } 
    } 
    int ISimple.Zero { 
     get{ return 0;} 
    } 
} 
class B : A, IAdvanced { 
    string IAdvanced.Major { 
     get { return "B"; } 
    } 
} 

Répondre

7

Je ne pense pas que nous pouvons connaître une réponse définitive ici, à moins que nous avons les développeurs compilateur en baisse Cependant, on peut deviner les raisons.. Il pourrait être:

  1. pour l'optimisation - peut-être cela économise du travail pour le compilateur JIT. Pour plus de lisibilité, il est plus facile pour les yeux humains de comprendre ce qu'un type implémente en regardant la sortie MSIL.
  2. parce que c'est comme ça que le stagiaire d'été l'a mis en place et comme ça fonctionne bien, personne ne va le changer au cas où il casse quelque chose.
+0

IIRC, tout est clairement défini dans la spécification. Donc, ne devinez pas ici. – leppie

+0

J'irais pour la porte numéro trois! ;-) – peSHIr

+0

Oui, la partition II des spécifications CLI indique clairement que ce n'est pas obligatoire. Je n'ai pas vu si il a dit que l'ajouter fait quelque chose cependant. – MichaelGG

Questions connexes