2016-11-22 10 views
1

мне было интересно, если это можно сравнить (INT) из двух отдельных Перечисления (от различных сценариев)?Сравнение значений enum в C#/Unity?

В настоящее время я пытаюсь:

if((int)newMiner.minerType == (int)resourceType) 
     { 
      Debug.Log("Resource Holder Accepts Miner"); 
     } 

newMiner является другим сценарием, который имеет перечисление Я пытаюсь сравнить и minerType это один Enum в то время как ResourceType является местным Enum Я пытаюсь сравнить его с.

Что я сейчас не возвращает ошибку, однако, он всегда возвращает истину. Любая информация о том, как это делает/не будет работать очень признателен :)

+0

Как выглядит ваш новый Miner и как выглядит ваш enumType enum? Вы должны отправить оба из них. – Programmer

+0

Можете ли вы вставить объявления перечисления? Я подозреваю, что все, что находится под minerType и resourceType, фактически не соответствует друг другу. –

+2

Теоретически, да, вы можете использовать 'Enum' для int и сравнивать их. Но 'Enum' также может использовать' [Flags] '(думаю, сразу несколько значений), что полностью нарушает это. Плюс каждый 'Enum' должен соответствовать их числовым значениям, чтобы это могло быть использовано. Кроме того, почему бы не поставить точку останова и посмотреть, какие целые числа вы получаете от обоих? – Zer0

ответ

2

Вы не можете это сделать.

Только один публично доступный перечисление! Используйте то же самое в обоих местах.

3

Допустим, у вас есть два перечислений

enum Car { Window, Door, Light, Gate, Bath } 

enum House { Window, Door, Light, Bath, Gate } 

Тогда у вас есть экземпляр с ними

Car car = Car.Window; 
House house = House.Window; 

Вы можете сравнить их непосредственно с if (car == house)?

NO

Вы можете сравнить их значения с if ((int)car == (int)house)?

Да. Похоже, это то, что вы пытаетесь сделать.

Пример 1:

if ((int)car == (int)house) 
    Debug.Log("Car Value matches House value"); 
else 
    Debug.Log("Car Value DOES NOT match House value"); 

Выход:

автомобиля Значение соответствует значение Дом

Это потому, что Window от Car Enum и Window от House Enum как доля в- тот же индекс значения Enum, который 0.

Пример 2:

Car car = Car.Light; 
House house = House.Light; 

if ((int)car == (int)house) 
    Debug.Log("Car Value matches House value"); 
else 
    Debug.Log("Car Value DOES NOT match House value"); 

Выход:

автомобиля Значение соответствует значение Дом

Опять же, это потому, что Light от Car Enum и Light от House Enum как доля тот же Enum v индекс, который составляет 2.

Пример 3:

Car car = Car.Gate; 
House house = House.Gate; 

if ((int)car == (int)house) 
    Debug.Log("Car Value matches House value"); 
else 
    Debug.Log("Car Value DOES NOT match House value"); 

Выход:

автомобиля Значение не соответствует значению Дом

Сюрприз! Сюрприз! Gate и Gate от Car и House Enum не совпадают. Почему?

Поскольку Gate от House Enum имеет значение 4 и в то время Gate от Car Enum имеет значение 3. 4! = 3.

Когда вы переводите Enum в int, вы получите его индексную позицию. Позиция начинается с 0, как массив. Например, код декларации Enum ниже показывает вам, как выглядит индекс.

enum Car { Window = 0, Door = 1, Light = 2, Gate = 3, Bath = 4 } 

Для если заявление, чтобы быть true, они оба должны быть в-же положении. Вы получите false, если они находятся в другом положении. Проверьте свой Enum снова и исправьте это.

+1

Отличное объяснение, за исключением того, что значение элемента перечисления не всегда является его индексом (это просто значение по умолчанию, если значения явно не назначены). И, конечно же, перечисления флагов - это целый другой чайник рыбы. – Cameron

+0

Да, да, вы правы. Я написал это, считая значение по умолчанию. Что касается флагов, да, это совсем другое дело, но OP не упоминает Flags, поэтому можно просто предположить, что OP просто пытается сравнить значения в двух разных Enums. – Programmer