В версиях .NET до 4.5 максимальный размер объекта составляет 2 ГБ. Начиная с версии 4.5, вы можете выделять более крупные объекты, если включен gcAllowVeryLargeObjects . Обратите внимание, что ограничение для string
не затронуто, но «массивы» должны охватывать и «списки», так как списки поддерживаются массивами.
Перечисления строго типизированы на 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.
Я отсылаю вас к Спецификации языка 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);
}
Если вы хотите, чтобы они совпадали, приведите их к int
Assert.AreEqual((int)enumA.one,(int)enumB.one);
, потому что они оба указаны первыми. Если вы хотите, чтобы они совпадали, потому что они оба говорят «один», вам нужно использовать отражение.
В отличие от Java, C # не предоставляет никаких средств для добавления методов (таких как operator == ()) в перечисление.
Когда мне потребовались более умные перечисления, я делал это раньше. создайте класс XHelper
(где X
- имя перечисления), и я поместил в него все методы. Таким образом, что-то вроде этого:
public static bool EnumAHelper.EqualsEnumB(EnumA enumA, EnumB enumB)
{
return (int)enumA == (int)enumB;
}
Хотя, я не припоминаю, чтобы я сталкивался со случаем, когда мне нужно было два разных перечисления для обозначения одного и того же.
Если честно, Equality не всегда прямолинейна.
Я был бы склонен создать вспомогательный класс, который реализует IEqualityComparer (и любые другие тесты на равенство, например IsSame ()) и использовать его.
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);
}
Вы можете попробовать преобразовать их:
Assert.AreEqual((int)enumA.one, (int)enumB.one);