У меня есть проблемы с областью перечисления - PullRequest
0 голосов
/ 14 марта 2011

По сути, у меня есть один класс с кодом шахматной игры, у него есть класс enum.

namespace WindowsFormsApplication1
{
    enum STATE { PROMOTION, CASTLING, CHECK, CHECKMATE, DONOTHING };

.....

Я хочу сослаться на это из своего кода формы: вот код:

namespace WindowsFormsApplication1
{

    public partial class ChessBoard: Form
    {
public STATE Gamestate { set; get; }

......

я получаю это:

Ошибка 1 Несогласованная доступность: тип свойства «WindowsFormsApplication1.STATE» менее доступен, чем свойство «WindowsFormsApplication1.ChessBoard.Gamestate» D: \ Documents and Settings \ Dima \ Мои документы \ Visual Studio 2008 \ Projects \ ChessBoardGame \ ChessBoardGame \ ChessBoard .cs 15 22 ChessBoardGame

Почему я получаю это и как я могу предотвратить это?

Ответы [ 3 ]

11 голосов
/ 14 марта 2011

Вы должны объявить свой enum как public в WindowsFormsApplication1:

namespace WindowsFormsApplication1
{
    public enum STATE { PROMOTION, CASTLING, CHECK, CHECKMATE, DONOTHING };

.....
9 голосов
/ 14 марта 2011

Прежде всего, пожалуйста, не используйте SCREAMING CAPS в C #. Используйте PascalCaseIdentifiers (или camelCaseIdentifiers для местных жителей); их гораздо приятнее читать.

Во-вторых, возможно, вам не хватает некоторых состояний. Неплохая идея отследить, находится ли игра в состоянии, когда разрешен захват en passent . У вас также нет состояния для тупиковой ситуации или других "нарисованных" ситуаций.

В-третьих, чтобы ответить на ваш актуальный вопрос: ошибка говорит вам, что не так. «State» и «GameState» имеют противоречивую доступность. Вы не добавили модификатор доступности в State, поэтому он получает доступность по умолчанию, которая является «внутренней» для перечисления верхнего уровня. «GameState» является публичной собственностью публичного класса. Таким образом, вы говорите, что «тип этой вещи, который доступен для общественности, является внутренней деталью реализации моей сборки», что, очевидно, кажется немного невозможным, поэтому компилятор помечает это.

Первый вопрос, который я хотел бы задать себе: «Почему класс публики?» Намереваетесь ли вы создать этот класс с помощью сборок вне этого?

Если вы хотите, чтобы класс был общедоступным, тогда:

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

Если вы хотите, чтобы класс был внутренним, сделайте его внутренним.

2 голосов
/ 14 марта 2011

Даже если он не отвечает на ваш вопрос (потому что это уже сделано @FreeAsInBeer), вам действительно следует придерживаться более распространенного соглашения об именах и поставить значение по умолчанию первым.Таким образом, результат может выглядеть примерно так:

public enum State
{
    DoNothing,
    Promotion,
    Castling,
    Check,
    Checkmate
}

Помещая DoNothing в качестве первого члена вашего перечисления, вы объявляете это как значение по умолчанию (0).Поэтому, если кто-то запрашивает default(State), он просто получает DoNothing, что звучит неплохо для значения по умолчанию.

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