Использование перечисления в качестве целочисленной константы в C # - PullRequest
6 голосов
/ 25 февраля 2010

Мой вопрос довольно прост, но я не нашел способа реализовать свой код так, как я хочу. Поэтому я начал задумываться, а не хорош ли код, который я хочу реализовать. И если это так, как лучше всего это сделать.

Вот так:

class InputManager  
{  
    SortedDictionary<ushort,Keys> inputList = new SortedDictionary<ushort,Keys>();  

    public void Add(ushort id, Keys key) {...}  
    public bool IsPressed(ushort id) {...}  
}  

class Main  
{  
    private enum RegisteredInput : ushort  
    {  
        Up,  
        Down,  
        Confirm  
    }  

    public Main()  
    {  
            InputManager manager = new InputManager();

            manager.Add(RegisteredInput.Up, Keys.Q);
            manager.Add(RegisteredInput.Down, Keys.A);
            manager.Add(RegisteredInput.Confirm, Keys.Enter);
    }

    void update()
    {
    if(manager.IsPressed(RegisteredInput.Up)) action();
    }
}

Этот код не скомпилируется, выдавая ошибки такого типа:

Наилучшее совпадение перегруженного метода для InputManager.Add (ushort, Keys) содержит недопустимые аргументы
Аргумент '1': невозможно преобразовать из 'RegisteredInput' в 'ushort'

Если я использую приведение типа manager.Add((ushort)RegisteredInput.Up, Keys.Q);, оно будет работать. Но так как приведение должно быть явным, мне было интересно, не является ли он рекомендуемым кодом в C #, как это делается в C ++, и есть ли лучший способ сделать это (например, использовать const ushort для каждого значения, что я вроде не делаю как много).

Лучший ответ, который я получил до сих пор, был от этой темы , но это звучит так же, как хак, я забеспокоился.

Спасибо!

Ответы [ 3 ]

7 голосов
/ 25 февраля 2010

Почему бы просто не определить словарь, используя ваше перечисление? Есть ли причина, по которой он должен быть int?

public void add(RegisteredInput id, Keys key) {...}  

Кроме того, обычно рекомендуется, чтобы общедоступные элементы (методы, типы и т. Д.) Были заключены в паскаль (другими словами, Add вместо add).

7 голосов
/ 25 февраля 2010

Сделать InputManager универсальным типом. IE:

class InputManager<T>
{
   SortedDictionary<T,Keys> inputList = new SortedDictionary<T,Keys>();  

   public void add(T id, Keys key) {...}  
   public bool isPressed(T id) {...}    
}
5 голосов
/ 25 февраля 2010

Неявное приведение необходимо для Enums. Я рекомендую это:

public static class RegisteredInput {
    public const ushort Up = 0;
    public const ushort Down = 1;
    public const ushort Confirm = 2;
}
...