модификатор доступа по умолчанию для enum в C # - PullRequest
7 голосов
/ 11 февраля 2012

Согласно MSDN здесь и здесь (а также принятый ответ на этот qstn ) доступность по умолчанию для перечислений public. Тем не менее, этот код:

public class Test
{
    enum Color { RED, BLUE, GREEN };
    public void SetColor(Color c) { }
}

вызовет эту ошибку компиляции:

Error 1 Inconsistent accessibility: parameter type 'Test.Color' is less accessible than method 'Test.SetColor(Test.Color)'

(что является той же ошибкой, которую вы получаете, устанавливая перечисление как private.) Эта ошибка может быть исправлена ​​только путем явного изменения перечисления как public. Документация неверна?

[Я компилирую с C # 2010 и .NET 4.0.]

Ответы [ 5 ]

11 голосов
/ 11 февраля 2012

Это не правда.

Доступность по умолчанию для enum types такая же, как и для любого другого типа; внутренний для типов верхнего уровня и закрытый для вложенных типов.

На страницах, на которые вы ссылаетесь, указано, что по умолчанию (и фактически только) уровень доступности для enum members (Red, Blue и т. Д.) Является открытым.

5 голосов
/ 11 февраля 2012

В упомянутых статьях MSDN и SO-ответе упоминается "член перечисления", т.е., например, Test.Color.RED, а не Test.Color как само перечисление.

Test.Color является членом класса, то есть частным лицом.

2 голосов
/ 11 февраля 2012

Эта таблица относится к членам ;членами являются «RED», «BLUE» и «GREEEN», и они действительно являются общедоступными литеральными константами, и указание доступности не допускается.класс (поля, методы, константы и т. д.);здесь, согласно таблице, по умолчанию используется значение «private», хотя вы можете указать более высокий уровень доступности.

1 голос
/ 11 февраля 2012

Я считаю, что, поскольку вы объявляете внутри класса без модификатора, он предполагает, что он является закрытым, поскольку это стандартное поведение в классе. Укажите публику, которая должна решить проблему. Однако обратите внимание, что Code Analysis рекомендует размещать это перечисление вне класса.

0 голосов
/ 11 февраля 2012

это потому, что у вас нет открытых, защищенных, внутренних в вашем перечислении, оно принимает значение по умолчанию (которое является внутренним для классов и перечислений)

извините за путаницу, вы не можете сделать собственность общедоступной, потому что перечисление является частным

публичная собственность будет внешне публичной, если кто-то использует вашу программу и компилятор сообщит вам об этом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...