2011-12-23 22 views
6

Tengo problemas con las enumeraciones en C#¿Por qué mis enums C# no funcionan?

tengo una enumeración aquí:

namespace Project.Shared 
{ 
    public enum CostType 
    { 
     Dollars, 
     Percent 
    } 
} 

Tengo un objeto que está tratando de utilizar la enumeración aquí:

using Project.Shared; 
namespace Project.Shared.FooNamespace 
{ 
    public class Foo 
    { 
     public int CostType { get; set; } 

     public Foo() 
     { 

      CostType = (int)CostType.Dollars; // <--- error syntax highlighting on 'Dollars' 
     } 
    } 
} 

Esto se traduce en un error:

'int' does not contain a definition for 'Dollars' and no extension method 'Dollars' accepting a first argument of type 'int' could be found (are you missing a using directive or an assembly reference?)

No entiendo por qué no puedo usar m y enum allí. ¿Alguien puede ayudarme a explicarme?

+6

Esto puede ser una pista de que no debe usar el mismo nombre para la enumeración que para la propiedad. –

+1

¿Por qué quiere almacenar el valor como int si tiene la enumeración y desea el valor enum? – WestDiscGolf

+0

Porque EntityFramework aún no admite el mapeo de Enume. – quakkels

Respuesta

16

Porque su clase Foo tiene esta definición - public int CostType { get; set; } - que tiene un alcance más local que su enum.

Trate de calificar completamente con su espacio de nombres:

CostType = (int)Project.Shared.CostType.Dollars; 
+1

Además, haría 'this.CostType =' para ayudar con la ambigüedad de 'CostType'. –

+0

@ErikPhilips +1 Estoy contigo. Mucha gente parece * despreciar * ver el calificador 'this' en código ... – Yuck

+1

Gracias por la ayuda ... esto lo resolvió. Feliz Navidad – quakkels

1

Has conflicto de nombres. Usted nombró su propiedad CostType que es lo mismo que enum name. De esta forma, C# supone que ambas referencias CostType en el método Foo() hacen referencia a la propiedad y no a la enumeración.

Usted podría intentar esto:

CostType = (int)Project.Shared.CostType.Dollars; 
1

El problema es que en CostType = (int)CostType.Dollars; dos ocurrencias de CostType se refieren a la variable. Y la variable CostType no tiene ninguna propiedad llamada Dollars. Incluya el espacio de nombres para referirse al tipo Project.Shared.CostType para referirse explícitamente al tipo, no a la variable.

1

cambiarlo a esto y que debería funcionar

public enum CostType 
{ 
    Dollars, 
    Percent 
} 

public class Foo 
{   
    public int CostTypes { get; set; } 
    public Foo() 
    { 
     CostTypes = (int)CostType.Dollars; 
     // <--- error syntax highlighting on 'Dollars' 
    } 
} 

que no reveló el nombre de mi propiedad de auto el mismo nombre que mi CostType enumeración He probado esto y lo que he publicado compiló y trabajar

+3

nombrar esta propiedad 'CostTypes' no tiene sentido. No es una enumeración de banderas, y por lo tanto, solo puede representar un solo 'CostType'. Entonces, ¿por qué estás usando el plural? – CodesInChaos

+0

Miré como si su pregunta tuviera un problema de acceso o de compilación si ese es el caso, entonces debería tener espacios de nombres totalmente calificados de hacer que coincidan – MethodMan

+0

@DJ KRAZE - Por la respuesta de Yuck ahora califico completamente los nombres – quakkels

12

Como otros han señalado que la propiedad es "más cercana" que el tipo, por lo que cuando se resuelve el nombre simple, la propiedad siempre gana.

Una arruga interesante en esta situación es que si hubiera hecho la propiedad del tipo CostType en lugar de int, hubiera funcionado.

La razón de esto es porque C# tiene una regla especial solo para esa situación, generalmente llamada regla "Color de color". (Debido a que es la situación en la que más comúnmente se presenta:. Un tipo llamado color y una propiedad llamada en color de tipo de color)

Si un simple nombre podría significar tanto un tipo y una propiedad o campo con eso nombre, de ese tipo, luego C# le permite acceder a los miembros estáticos a través de los miembros de la instancia tipo y a través de la propiedad.Esto le permite hacer cosas como:

Color = Color.Red; 
description = Color.ToString(); 

El primer y tercer colores son referencias a la propiedad; el segundo es una referencia al tipo.

+1

+1 por algo nuevo aprendido hoy –

+0

+1 Muy interesante, tampoco lo sabía. – Yuck

0

Resolví mi: 'ENUM no contiene una definición para el error VALUE', al reiniciar Visual Studio. Por si acaso alguien tiene el mismo problema.

Cuestiones relacionadas