2010-02-24 6 views
9

Escribo el siguiente código para algunas pruebas, y la salida está fuera de mis expectativas.¿Por qué System.Enum no es un tipo de valor?

public enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };  
Console.WriteLine(typeof(System.Enum).IsValueType.ToString()); // False 
Console.WriteLine(typeof(Days).IsValueType.ToString()); // True 

Así que consulte con reflector de la aplicación de la propiedadType.IsValueType. Que es:

public bool get_IsValueType() 
{ 
    return this.IsValueTypeImpl(); 
} 
protected virtual bool IsValueTypeImpl() 
{ 
    Type type = this; 
    return (((type != valueType) && (type != enumType)) && this.IsSubclassOf(valueType)); 
} 

En MSDN, System.Enum se define como:

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

Entonces por qué el IsValueType implentmented de esa manera? ¿Por qué hay una detección para enumType?

Respuesta

16

Todas las enumeraciones heredan de System.Enum. No puede heredar de un tipo de valor, por lo tanto System.Enum no puede ser un tipo de valor.

Es como System.ValueType no es un tipo de valor. Es solo una pequeña rareza que surge del resto de las reglas. Para dar un ejemplo más concreto de los problemas que se causaría, tome este código:

enum Foo : int { X } 
enum Bar : long { Y } 

... 

Enum x = Foo.X; 
x = Bar.Y; 

¿Cuánto espacio debe reservarse en la pila de x? ¿Debería ser 0 bytes, ya que System.Enum no tiene ningún campo (truncando datos en la asignación)? ¿Deberían ser 8 bytes para permitir el mayor tipo de enumeración posible? La herencia del tipo de valor básicamente genera problemas en torno a las expectativas, por lo que está prohibido (creo). Esas razones se aplican tanto a las enumeraciones como a otros tipos.

+0

Gracias Jon. Eso me confunde. Dos preguntas que tengo 1) Si System.ValueType no es un tipo de valor, ¿cómo averiguar si un tipo es de tipo de valor o no? 2) en el ejemplo anterior, puede asignar un tipo de valor (Foo.x) a un tipo de referencia (Enum) implícitamente, ¿qué pasa con el boxeo y el desempaquetado? – KFL

Cuestiones relacionadas