Когда два перечисления равны по C#?

В версиях .NET до 4.5 максимальный размер объекта составляет 2 ГБ. Начиная с версии 4.5, вы можете выделять более крупные объекты, если включен gcAllowVeryLargeObjects . Обратите внимание, что ограничение для string не затронуто, но «массивы» должны охватывать и «списки», так как списки поддерживаются массивами.

7
задан Peter 5 November 2009 в 21:32
поделиться

7 ответов

Перечисления строго типизированы на C #, поэтому enumA.one! = EnumB.one . Теперь, если бы вы преобразовали каждое перечисление в их целочисленное значение, они были бы равны.

Assert.AreEqual((int)enumA.one, (int)enumB.one);

Кроме того, я хотел бы оспорить утверждение, что, поскольку они имеют одинаковое целочисленное или строковое представление, они должны быть одинаковыми или равными. Учитывая два перечисления NetworkInterface и VehicleType , для C # или .Net Framework было бы нелогично разрешать NetworkInterface.None равным VehicleType.None при сравнении как перечисление либо по значению, либо по строке. Однако, если разработчик преобразовал строго типизированное перечисление в целое число или строку, язык или структура ничего не могут сделать, чтобы помешать им быть равными.

Для дальнейшего пояснения, вы не можете переопределить MyEnum.Equals , чтобы предоставить другой метод равенства. Перечисления .Net - не совсем первоклассные граждане, как в более поздних версиях Java, и я хочу, чтобы C # позволял более богатое взаимодействие с Enums.

14
ответ дан 6 December 2019 в 08:44
поделиться

Я отсылаю вас к Спецификации языка C # v3.0, из которой эта цитата была извлечена из раздела Enum на странице 29:

"У каждого типа перечисления есть соответствующий интегральный тип, называемый базовым типом перечисляемого типа. Тип перечисления, который явно не объявляет базовый тип, имеет базовый тип int. Формат хранения перечисляемого типа и диапазон возможных значений определяются его базовый тип. Набор значений, которые может принимать тип перечисления, не ограничен его членами перечисления. В частности, любое значение базового типа перечисления может быть приведено к типу перечисления и является отдельным допустимым значением этого enum type. "

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

public enum enumA { one, two }
public enum enumB { one, two }
[Test]
public void PreTest()
{
        Assert.AreEqual((int)enumA.one,(int)enumB.one);
        Assert.AreSame(enumA.one, enumB.one);
}
3
ответ дан 6 December 2019 в 08:44
поделиться

Если вы хотите, чтобы они совпадали, приведите их к int

Assert.AreEqual((int)enumA.one,(int)enumB.one);

, потому что они оба указаны первыми. Если вы хотите, чтобы они совпадали, потому что они оба говорят «один», вам нужно использовать отражение.

1
ответ дан 6 December 2019 в 08:44
поделиться

В отличие от Java, C # не предоставляет никаких средств для добавления методов (таких как operator == ()) в перечисление.

Когда мне потребовались более умные перечисления, я делал это раньше. создайте класс XHelper (где X - имя перечисления), и я поместил в него все методы. Таким образом, что-то вроде этого:

public static bool EnumAHelper.EqualsEnumB(EnumA enumA, EnumB enumB)
{
    return (int)enumA == (int)enumB;
}

Хотя, я не припоминаю, чтобы я сталкивался со случаем, когда мне нужно было два разных перечисления для обозначения одного и того же.

2
ответ дан 6 December 2019 в 08:44
поделиться

Если честно, Equality не всегда прямолинейна.

Я был бы склонен создать вспомогательный класс, который реализует IEqualityComparer (и любые другие тесты на равенство, например IsSame ()) и использовать его.

1
ответ дан 6 December 2019 в 08:44
поделиться
    public enum enumA {one = 1, two = 2}

    public enum enumB {one = 1, two = 2}

    [Test]
    public void PreTest()
    {                       
        Assert.AreEqual((int)enumA.one, (int)enumB.one);
        // I don't think this one will ever pass
        Assert.AreSame(enumA.one, enumB.one); 
    }
0
ответ дан 6 December 2019 в 08:44
поделиться

Вы можете попробовать преобразовать их:

Assert.AreEqual((int)enumA.one, (int)enumB.one);
0
ответ дан 6 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

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