C# 枚举问题

Posted

技术标签:

【中文标题】C# 枚举问题【英文标题】:C# Enumeration Issue 【发布时间】:2017-11-29 05:14:39 【问题描述】:

我目前正在用 C# 设计一个游戏引擎。该引擎有多种驱动类型(OpenGL、DirectX)。然而,当用户按下按钮时,每种驱动程序类型需要不同的键码。但由于某种原因,使用预处理器不起作用......请注意,我对使用它们很陌生。

我真的认为(就像在大多数情况下一样)让别人理解我正在尝试做的最好的方法是展示一些代码。

这是我的 KeyCode 枚举(或其中的一部分):

public enum KeyCode

#if DRIVER_TYPE_OPENGL
        A = 83,
        B = 84
#elif DRIVER_TYPE_DRIECTX
        A = 65,
        B = 66
#endif

在我的 OpenGL Window 类的顶部,我已经这样做了:

#define DRIVER_TYPE_OPENGL

在我的 DirectX Window 类的顶部,我已经这样做了:

#define DRIVER_TYPE_DRIECTX

据我了解,我现在应该可以做这样的事情了:

        IDisplay display = new OpenGLDisplay(WIDTH, HEIGHT, TITLE);

        while (true)
        
            // Do stuff with display

            // Process input like so:
            if (Keyboard.IsKeyDown(KeyCode.A))
            
                Console.WriteLine("You're using OpenGL driver, good on you!")
            

            // Swap buffers and stuff
        

        display.Close();

但是,我收到一条错误消息:“KeyCode 不包含 'A' 的定义”

我做错了什么?

提前感谢您的帮助!

【问题讨论】:

您不使用 switch-case 的任何特殊原因? @SouvikGhosh 因为我不能在枚举中使用 switch-case,我宁愿不要同时使用“OpenGLKeyCode”和“DirectXKeyCode”枚举。 @aaron 只会将 A 值设为 65,并且不允许我在 OpenGL 和 DirectX 键码值之间切换。 @tdkr80 你在哪里定义你的枚举? @Blacktempel 它是在任何类之外定义的,完全由它自己定义。 【参考方案1】:

移动您的枚举或使用项目范围的定义。

定义仅适用于您#define它的文件。 这是 C#,而不是带有标头的 C++。

【讨论】:

我想可能是这样。如何使用项目范围的定义? @tdkr80 右击你的项目,属性->构建->条件编译符号。 @tdkr80 另见***.com/questions/1995869/… 但是我仍然无法在 KeyCodes 范围之外取消定义或定义它们,对吗? @tdkr80 您可以在文件顶部使用#undef#define。但仅适用于整个文件和单个文件。

以上是关于C# 枚举问题的主要内容,如果未能解决你的问题,请参考以下文章

C#枚举

C# 枚举问题

XSD2Code++,从 XML 枚举到没有顺序值的 C# 枚举

c#中怎样定义枚举?

c# 枚举的定义,枚举的用法,获取枚举值

C#啥是枚举呢?