2012-07-03 7 views
8

que tienen tres enumeraciones:Valores de enumeración como resultado de una función

enum ValueType : int 
{ 
    FloatingPoint = 2, 
    .../... 
} 
enum ConstraintType : int 
{ 
    Range = 2, 
    .../... 
} 
enum Parameter : int 
{ 
    ExposureTime = F(ValueType.FloatingPoint, ConstraintType.Range, 23), 
    .../... 
} 

El problema está en la firma de F si uso:

private static int F(ValueType _V, ConstraintType _C, int _N) { ... } 

Me aparece un error (argumentos no válidos) para cada llamada en la definición de Parameter, pero si uso el siguiente lugar:

private static int F(int _V, int _C, int _N) { ... } 

Todo está bien.

No es un problema de bloqueo, pero me gustaría entender por qué es eso.

+2

¿cómo se llama F? ¿Estás pasando ints o enums como params? – kristian

+0

@kristian: Eso está establecido en la pregunta :-) Ver el primer bloque de código. (No lo vi al principio, tampoco.) –

+0

@ O.R.Mapper ¿cómo se colaron allí? ;) – kristian

Respuesta

9

Los estados C# spec en la sección 14.3 ("miembros de enumeración") que

Within an enum member initializer, values of other enum members are always treated as having the type of their underlying type, so that casts are not necessary when referring to other enum members.

Por lo que yo puedo decir que esto es por qué los argumentos parecen tener un tipo de int. Es interesante notar que esto no dará lugar a un error argumento no válido:

ExposureTime = F((ValueType)ValueType.FloatingPoint, 
       (CostraintType)ConstraintType.Range, 
       23), 

Por supuesto que todavía dará lugar a otro error porque no se puede utilizar una llamada a un método para inicializar los miembros de enumeración como dice Marc. Una llamada a un método no es una expresión constante, mientras que

The associated value of an enum member is assigned either implicitly or explicitly. If the declaration of the enum member has a constant-expression initializer, the value of that constant expression, implicitly converted to the underlying type of the enum, is the associated value of the enum member. If the declaration of the enum member has no initializer, its associated value is set implicitly [...]

+0

Excelente observación de especificaciones –

7

Para enumeraciones con valores explícitos, el valor debe ser una expresión constante. F(...) es no una expresión constante. Independientemente de si los parámetros son int o enumeraciones, no puede asignar un valor enum a partir de una llamada a función.

Su "todo está bien" en realidad significa:

The expression being assigned to 'blah.Parameter.ExposureTime' must be constant

El único "problema" es que el compilador no da un mensaje de error muy elegante a un escenario ilegal en particular.

+0

En realidad, el compilador da el mensaje de error esperado si la firma del método se modifica para aceptar entradas. – Jon

+0

Ok, me perdí eso ... – gregseth

Cuestiones relacionadas