2010-02-24 7 views
9

MSDN define System.Enum como una clase abstracta:¿Por qué no puedo derivar de la clase abstracta de System.Enum?

[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible 

Y también MSDN hacer tal declaración acerca de la clase abstracta:

Una clase abstracta no puede ser instanciada . El objetivo de una clase abstracta es proporcionar una definición común de una clase base que pueden compartir múltiples clases derivadas.

Pero simplemente no puedo derivar de System.Enum. Según Jeffery Richter en su libro "CLR via C#", es el compilador de C# que prohíbe esa derivación.

Y comprobé los miembros de System.Enum, la mayoría de ellos son estáticos, lo cual es razonable porque no se puede instanciar y los métodos estáticos no necesitan una instancia de objeto para invocar. Pero también hay algunos métodos de instancia, como GetHashCode() y GetTypeCode().

lo tanto, mi primera pregunta es, si no System.Enum se pueden crear instancias o deriva, ¿cómo podría estos métodos de instancia invocar? ¿No es esto una especie de paradoja?

Sé que podría utilizar el siguiente enfoque para invocar estos métodos de instancia , pero ¿por qué? ¿Hay algún tipo de System.Enum o el tipo derivado objeto instancia creado? ¿Cuando? y por quien?

public enum Days:byte { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; 
Days d = Days.Friday; 
d.GetTypeCode(); 
d.GetHashCode(); 
+0

Days does derive from enum ... ¿cuál es tu confusión? –

Respuesta

7

Puede derivar de Enum, p. Ej.

public enum MyEnum 
{ 
    // ... 
} 

se compilará a algo como:

.class public auto ansi sealed MyEnum 
    extends System.Enum 
{ 
    // ... 
} 

La restricción de los lugares compilador de C# es que no va a dejar que se escribe la derivación manualmente, sino que requiere el uso de la palabra clave enum al declarar el tipo.

En cuanto a por qué esto es ... mi conjetura es porque las enumeraciones son un poco raras en el CLR. Por ejemplo, los tipos de base ValueType y Enum son a su vez tipos de referencia, no tipos de valores. Hay un montón de magia bajo cubierta, y si fuerza el uso de una palabra clave y evita la derivación de la clase base mágica, entonces mantendrá su intención separada de la magia.

+0

Gracias, Greg. Tu respuesta resolvió parcialmente mi problema. Ahora me pregunto por qué no nos permite extender el System.Enum directamente. – smwikipedia

+0

@smwikipedia - Acabo de agregar mi conjetura de por qué es esto. Sin embargo, tendrías que conseguir uno de los diseñadores del lenguaje C# para verificarlo (Eric Lippert está aquí regularmente para que pueda pasar con algo de suerte). –

+0

gracias, he enviado un correo electrónico a Eric Lippert y espero que pueda responder pronto. – smwikipedia

0

enumeraciones son el tipo de valor que por qué no puede instanctiate o derivar de ella. Los métodos de instancia como GetHashCode() solo están presentes para los objetos de tipo de referencia, como las clases.

Cuestiones relacionadas