Используя перечисление как целочисленная константа в C#

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

Здесь это идет:

class InputManager  
{  
    SortedDictionary inputList = new SortedDictionary();  

    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. Добавьте (ushort, Ключи)' имеет некоторые недействительные аргументы
Аргумент '1': не может преобразовать от 'RegisteredInput' до 'ushort'

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

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

Спасибо!

6
задан Community 23 May 2017 в 10:33
поделиться

3 ответа

Сделать 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) {...}    
}
7
ответ дан 8 December 2019 в 12:19
поделиться

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

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

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

7
ответ дан 8 December 2019 в 12:19
поделиться

Неявное приведение необходимо для перечислений. Я рекомендую следующее:

public static class RegisteredInput {
    public const ushort Up = 0;
    public const ushort Down = 1;
    public const ushort Confirm = 2;
}
5
ответ дан 8 December 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: