2010-12-31 12 views
45

Hallo Ich versuche, wie so eine statische Enum declar:Probleme statische Enum erklärt, 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) 
     { 
      ...    

„ Aber ich die folgende Fehlermeldung erhalten:“ Der Modifikator ‚statisch‘ ist nicht gültig für ..! this item“ ich weiß, es ist etwas einfach, aber ich kann das Problem nicht zu sehen scheint Vielen dank

+0

Genau das gleiche gilt für [Teilnehmer] (http://stackoverflow.com/questions/6835766/why -can-a-net-delegate-nicht-deklariert-statisch) und [structs] (http://stackoverflow.com/questions/2613376/why-cant-you-declare-a-static-struct-in- c-aber-sie-können-statische-Methoden) – nawfal

Antwort

98

Enums sind Typen, keine Variablen. Daher sind sie per Definition "statisch", Sie brauchen das Schlüsselwort nicht.

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

enums sind per Definition "statisch", aber wir können verwende es nicht innerhalb der statischen Klasse, warum? – user2323308

+0

@ user2323308 ** 10.1.1.3 Statische Klassen ** Eine statische Klasse kann nicht instanziiert werden, kann nicht als Typ verwendet werden und darf nur statische Member enthalten. Eine statische Klasse kann nur statische Member enthalten (** §10.3. 7 **). * Beachten Sie, dass Konstanten und verschachtelte Typen als statische Elemente klassifiziert sind *. ** 10.3.7 Statische und Instanzmitglieder ** Mitglieder einer Klasse sind entweder statische Mitglieder oder Instanzenmitglieder ... * ... eine Konstanten- oder Typdeklaration deklariert implizit ein statisches Mitglied. * Ref: https: // docs .microsoft.com/de-de/dotnet/csharp/Sprachreferenz/Sprachspezifikation – samosaris

12

Nehmen static aus
Aufzählungen Typen sind, das nicht Mitglied,. es gibt kein Konzept eines statischen oder nicht -Static Enum.

Möglicherweise versuchen Sie, ein statisches Feld Ihres Typs zu erstellen, aber das hat nichts mit der Typdeklaration zu tun.
(Obwohl Sie wahrscheinlich kein statisches Feld machen sollten)

Auch you should not make public nested types.

+0

Danke, es war eine lange Nacht. Ich habe das "Statische" entfernt und alles ist gut. Auch ich habe Ihren Link gelesen und es scheint, dass eine verschachtelte Enum eine Ausnahme von Ihrer Regel ist. "Geschachtelte Enumeratoren und geschützte Typen sind von dieser Regel ausgenommen." – RayLoveless

+0

@SLaks, macht diese Regelausnahme für Sie Sinn? – RayLoveless

+0

@Ray: Ein Enumerator ('IEnumerator ' Implementierung) hat nichts mit einem Enum zu tun. – SLaks

1

Sie versuchen, eine Enum-Deklaration statisch zu machen, dh ein Feld vom Typ ProfileMenuBarTab. Um eine Klasse (oder was auch immer) in einer Klasse zu deklarieren, lassen Sie die statische Variable aus.

1

Eine Enum ist ein Typ, kein Wert. Der Modifikator static macht da keinen großen Sinn.

+2

Eine Klasse ist ein Typ zu und kann statisch sein. und da Sie nicht auf diese Enumeration mit einer Instanz dieser Klasse zugreifen können, ist es sicher statisch und sollte daher den statischen Modifikator verwenden, alles andere ist nur inkonsistent, aber dann ist es C# .. – MushyPeas

5

Sie brauchen nicht als static.When zu definieren, ein Aufzählungstyp erstellt wird, schaltet sich der C# -Compiler jedes Symbol in einem konstanten Feld des Typs. Beispielsweise behandelt der Compiler die Farbe Aufzählung früher gezeigt, als ob Sie auf die folgende ähnlich geschriebenen Code hatte:

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__; 
}