我有enum的范围问题

时间:2011-03-14 12:34:19

标签: c# enums

基本上,我有一个带有国际象棋游戏代码的课程, 它有一个枚举类..

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 \ My Documents \ Visual Studio 2008 \ Projects \ ChessBoardGame \ ChessBoardGame \ ChessBoard .cs 15 22 ChessBoardGame

为什么我会得到它,我该如何预防呢?

3 个答案:

答案 0 :(得分:11)

您需要在public中声明您的枚举为WindowsFormsApplication1

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

.....

答案 1 :(得分:9)

首先,请不要在C#中使用SCREAMING CAPS。使用PascalCaseIdentifiers(或本地人的camelCaseIdentifiers);他们阅读起来会更愉快。

其次,你可能会错过一些州。跟踪游戏是否处于允许 en passent 捕获的状态并不是一个坏主意。你也没有陷入僵局或其他“被吸引”的状态。

第三,解决你的实际问题:错误告诉你出了什么问题。 “State”和“GameState”具有不一致的可访问性。您省略了在State上放置辅助功能修饰符,因此它获得了顶级枚举的“内部”默认辅助功能。 “GameState”是公共类的公共财产。所以你说“公众可用的这个东西的类型是我的程序集的内部实现细节”,这显然有点不可能,所以编译器标记它。

我要问自己的第一个问题是“为什么上课?”你是否打算让这个类由这个以外的程序集创建?

如果您打算让班级公开,那么:

  • 将该属性设为私有或内部,或
  • 让枚举公开

如果您打算将课程设为内部课程,请将课程内部化。

答案 2 :(得分:2)

即使它没有回答你的问题(因为这已经由@FreeAsInBeer完成),你应该考虑坚持一些更常见的命名约定并将默认值作为第一个。所以结果看起来像是:

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

DoNothing作为枚举的第一个成员,将其声明为默认值(0)。因此,如果有人要求default(State),他只需获得DoNothing,这听起来非常适合默认值。