Enum Бокс и равенство
Почему это возвращает False
public enum Directions { Up, Down, Left, Right }
static void Main(string[] args)
{
bool matches = IsOneOf(Directions.Right, Directions.Left, Directions.Right);
Console.WriteLine(matches);
Console.Read();
}
public static bool IsOneOf(Enum self, params Enum[] values)
{
foreach (var value in values)
if (self == value)
return true;
return false;
}
в то время как это возвращает True?
public static bool IsOneOf(Enum self, params Enum[] values)
{
foreach (var value in values)
if (self.Equals(value))
return true;
return false;
}
Ответы
Ответ 1
Enum не реализует оператор равенства ==, но переопределяет метод Equals.
Так как он не реализует ==, система выполняет контрольную проверку равенства. Обратите внимание, что System.Enum - это класс, не являющийся структурой. Следовательно, такие значения, как Directions.Left, помещаются в коробки. В этом конкретном случае объекты в штучной упаковке становятся отдельными объектами, поэтому они не выполняют тестовый тест равенства.
Компилятор понимает == для конкретных типов Enum (например, Directions), но компилятор не выполняет эту специальную обработку по типу System.Enum.
Ответ 2
Как говорит JB, бокс. Вы можете увидеть это, изменив значение с Enum на Directions:
public static bool IsOneOf(Directions self, params Directions[] values)
{
foreach (var value in values)
if (self == value)
return true;
return false;
}
Возвращается true.