2009-04-17 14 views
13

El compilador de C# parece indicar explícitamente todas las interfaces que se implementan y sus clases base. Las especificaciones CLI dicen que esto no es necesario. He visto otros compiladores que no emiten esto explícitamente, y parece funcionar bien. ¿Hay alguna diferencia o razón por la C# hace esto?¿Por qué el compilador de C# declara explícitamente todas las interfaces que implementa un tipo?

El MSIL que el C# en la parte inferior genera para B es:

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

No debe necesitar especificar ISimple, porque A lo implementa como lo hace IAdvanced. C# Código:

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"; } 
    } 
} 

Respuesta

7

creo que no podemos conocer ninguna respuesta definitiva aquí, a menos que tengamos el compilador desarrolladores caen en Sin embargo, podemos conjeturar sobre las razones.. Podría ser:

  1. para la optimización - quizás ahorre algo de trabajo para el compilador JIT.
  2. para facilitar la lectura: hace que sea más fácil para los ojos humanos comprender qué tipo de instrumento se aplica al mirar la salida de MSIL.
  3. porque así es como lo implementó el interno de verano y dado que funciona bien, nadie va a cambiarlo por si acaso rompe algo.
+0

IIRC, todo está claramente definido en la especificación. Así que no adivine aquí. – leppie

+0

¡Iré por la puerta número tres! ;-) – peSHIr

+0

Sí, la Partición II de las especificaciones CLI deja bastante claro que no es necesario. No vi si decía que agregar algo realmente hace algo. – MichaelGG

Cuestiones relacionadas