проблемы с объявлением статического перечисления, 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)
        {
            ...            

" Но я получаю следующую ошибку: "Модификатор 'static' недействителен для этого элемента". Я знаю, что это что-то простое, но я не вижу проблемы. Большое спасибо!


person RayLoveless    schedule 31.12.2010    source источник
comment
То же самое для делегатов и структуры   -  person nawfal    schedule 02.01.2014


Ответы (6)


Перечисления - это типы, а не переменные. Поэтому они являются «статическими» по определению, вам не нужно ключевое слово.

public enum ProfileMenuBarTab { MainProfile, Edit, PhotoGallery }
person magnattic    schedule 31.12.2010
comment
перечисления являются «статическими» по определению, но мы не можем использовать их внутри статического класса, почему? - person user2323308; 01.02.2017
comment
@user2323308 10.1.1.3 Статические классы Статический класс не может быть создан, не может использоваться как тип и может содержать только статические члены... Статический класс может содержать только статические члены (§10.3 .7). Обратите внимание, что константы и вложенные типы классифицируются как статические члены. 10.3.7 Статические члены и члены-экземпляры Членами класса являются либо статические члены, либо члены-экземпляры... ... объявление константы или типа неявно объявляет статический член. ref : docs.microsoft.com/en-us/dotnet /csharp/языковая ссылка/ - person samis; 19.06.2017

Уберите static.
Перечисления — это типы, а не члены; нет понятия статического или нестатического перечисления.

Возможно, вы пытаетесь создать статическое поле своего типа, но это не имеет ничего общего с объявлением типа.
(хотя вам, вероятно, не следует создавать статическое поле)

Кроме того, вы не должны создавать public вложенных типов.

person SLaks    schedule 31.12.2010
comment
Спасибо, это была долгая ночь. Я снял статику и все в порядке. Также я читал вашу ссылку, и кажется, что вложенное перечисление является исключением из вашего правила. Это правило не распространяется на вложенные перечислители и защищенные типы. - person RayLoveless; 31.12.2010
comment
@SLaks, имеет ли для вас смысл это исключение из правил? - person RayLoveless; 31.12.2010
comment
@Ray: перечислитель (реализация IEnumerator<T>) не имеет ничего общего с перечислением. - person SLaks; 31.12.2010
comment
Это правило не распространяется на вложенные перечислители и защищенные типы. - person Aaron H.; 24.02.2011
comment
@SLaks, у него есть общедоступное перечисление, вы разместили ссылку, в которой говорится, что не следует делать общедоступными вложенные типы, и я просто указал, что согласно странице, на которую вы ссылаетесь, перечисления освобождены, поэтому их можно сделать общедоступными. - person Aaron H.; 24.02.2011
comment
@Aaron: перечислитель (реализация IEnumerator<T>) не имеет ничего общего с перечислением. - person SLaks; 24.02.2011
comment
@SLaks, я думаю, было бы полезно, если бы я прочитал комментарии перед своими ... Извините за повторение. Но что-то еще не ясно; вы продолжаете говорить, что IEnumerator‹T› не имеет ничего общего с перечислением, но почему вы так говорите? Я не вижу никакой связи с его вопросом о перечислении и интерфейсом для перечисления коллекций? - person Aaron H.; 24.02.2011
comment
@Aaron: Руководство MSDN, которое вы и Рэй цитируете, говорит о IEnumerator<T>. (Вот что означают вложенные перечислители) - person SLaks; 24.02.2011
comment
@SLaks, понял, я не распознал различие между перечислением и перечислителем, когда читал его. Это сбивающее с толку исключение из правил, хотя оно имеет смысл, если подумать об этом некоторое время. Спасибо. - person Aaron H.; 24.02.2011
comment
@Aaron: он используется всеми встроенными универсальными коллекциями (по какой-то причине со структурами) - person SLaks; 24.02.2011
comment
В какой-то момент за прошедшее десятилетие текст вашей исходной ссылки должен был быть обновлен. Теперь он читает вложенные перечисления, а защищенные типы исключены из этого правила. (выделено мной) - person Art Schmidt; 30.04.2020

Вам не нужно определять его как статический. Когда перечисляемый тип компилируется, компилятор C# превращает каждый символ в постоянное поле типа . Например, компилятор обрабатывает перечисление Color, показанное ранее, как если бы вы написали код, подобный следующему:

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__;
}
person Tarik    schedule 21.05.2012

Перечисление — это тип, а не значение. Модификатор static здесь не имеет особого смысла.

person Brian Clapper    schedule 31.12.2010
comment
Класс тоже является типом и может быть статическим. и поскольку вы не можете получить доступ к этому перечислению с экземпляром этого класса, он, безусловно, является статическим и, следовательно, должен использовать статический модификатор, все остальное просто несовместимо, но опять же это С#.. - person MushyPeas; 16.01.2015

Вы пытаетесь сделать объявление перечисления статическим, т.е. полем типа ProfileMenuBarTab. Чтобы объявить класс (или что-то еще) в классе, оставьте static вне.

person Femaref    schedule 31.12.2010

Типы в .Net могут быть либо типами значений, либо типами ссылок.

Типы значений -> enums, structs и built-in values types(bool, byte, short, int, long, sbyte, ushort, uint, ulong, char, double, decimal)

Типы ссылок -> classes, interfaces, delegates, dynamic и strings

Итак, как видите, перечисления — это типы (например, classes и structs, etc). точнее, это типы значений. Важным моментом в отношении типов значений является то, что вы должны иметь возможность создавать из них экземпляры. Например, какая польза от int, который является структурой (типом значения), если вы не можете создать его экземпляр для хранения в нем 2, 3 или любого числа?!

Это общее правило -> вы не можете создавать пользовательские типы значений (enums и structs) с модификатором static.

Некоторые моменты:

  • Если вы пишете свои enums или structs непосредственно в namespace, они не могут быть помечены как private или protected, как и другие типы. Они могут быть просто public или internal, как и другие типы.

  • Если вы пишете свои enums или structs непосредственно в class, вы также можете пометить их как private или protected, так как вы можете пометить их как internal и public. class для внутренних типов аналогичен namespace для типов, за исключением того, что вы также можете отметить внутренние типы private или public.

person Community    schedule 16.12.2019