2010-12-31 6 views
45

Hola estoy tratando de declar una enumeración estática de este modo:problemas que declaran enumeración estática, C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace Lds.CM.MyApp.Controllers 
{ 
    public class MenuBarsController : Controller 
    { 
     // Menu Bar enums 
     public static enum ProfileMenuBarTab { MainProfile, Edit, photoGallery } 

     public ActionResult cpTopMenuBar(string tabSelected) 
     { 
      ...    

" Pero estoy consiguiendo el error siguiente:" El modificador 'estático' no es válido para ..! este artículo" sé que es algo sencillo, pero me parece que no puede ver el problema Muchas gracias

+0

Justo lo mismo para [delegados] (http://stackoverflow.com/questions/6835766/why -can-a-net-delegate-not-be-declared-static) y [structs] (http://stackoverflow.com/questions/2613376/why-cant-you-declare-a-static-struct-in- c-pero-ellos-pueden-tener-métodos-estáticos) – nawfal

Respuesta

98

Los mensajes son tipos, no variables. Por lo tanto, son "estáticos" por definición, no necesita la palabra clave.

public enum ProfileMenuBarTab { MainProfile, Edit, PhotoGallery } 
+0

las enumeraciones son 'estáticas' por definición, pero podemos No lo uso dentro de la clase estática ¿por qué? – user2323308

+0

@ user2323308 ** 10.1.1.3 Static classes ** Una clase estática no puede crearse una instancia, no puede usarse como un tipo y puede contener solo miembros estáticos ... Una clase estática solo puede contener miembros estáticos (** §10.3. 7 **). * Tenga en cuenta que las constantes y los tipos anidados se clasifican como miembros estáticos *. ** 10.3.7 Miembros estáticos y de instancia ** Los miembros de una clase son miembros estáticos o miembros de instancia ... * ... una declaración de constante o tipo declara implícitamente un miembro estático. * Ref: https: // docs .microsoft.com/es-us/dotnet/csharp/language-reference/language-specification – samosaris

12

Sacar static
enumeraciones son tipos, que no son miembros;. no existe el concepto de un estático o no -estado estático.

Puede estar intentando hacer un campo estático de su tipo, pero eso no tiene nada que ver con la declaración de tipo.
(Aunque es probable que no deba crear un campo estático)

También, you should not make public nested types.

+0

Gracias, ha sido una noche larga. Eliminé el "estático" y todo está bien. También estaba leyendo su enlace y parece que una enumeración anidada es una excepción a su regla. "Los enumeradores anidados y los tipos protegidos están exentos de esta regla". – RayLoveless

+0

@SLaks, ¿esta excepción de reglas tiene sentido para usted? – RayLoveless

+0

@Ray: un enumerador (implementación 'IEnumerator ') no tiene nada que ver con una enumeración. – SLaks

1

Está tratando de hacer una declaración enum estática, es decir, un campo del tipo ProfileMenuBarTab. Para declarar una clase (o lo que sea) en una clase, deje la estática fuera.

1

Una enumeración es un tipo, no un valor. El modificador static no tiene mucho sentido allí.

+2

Una clase también es un tipo y puede ser estática. y como no se puede acceder a esta enumeración con una instancia de esa clase, es seguro que estática y por lo tanto debería usar el modificador estático, todo lo demás es simplemente inconsistente, pero de nuevo es C# .. – MushyPeas

5

No es necesario definirlo como static.When un tipo enumerado se compila, el compilador de C# se vuelve cada símbolo en un campo constante del tipo. Por ejemplo, el compilador trata la enumeración de color muestra el código anterior como si hubiera escrito similar al siguiente:

internal struct Color : System.Enum { 
      // Below are public constants defining Color's symbols and values 
      public const Color White = (Color) 0; 
      public const Color Red = (Color) 1; 
      public const Color Green = (Color) 2; 
      public const Color Blue = (Color) 3; 
      public const Color Orange = (Color) 4; 
      // Below is a public instance field containing a Color variable's value 
      // You cannot write code that references this instance field directly 
      public Int32 value__; 
}