TryParse из Enum работает, но я думаю, что это не должно

У меня есть следующий Enum (который генерируется из xsd):

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.ebutilities.at/invoice/02p00")]
[System.Xml.Serialization.XmlRootAttribute("Sector", Namespace = "http://www.ebutilities.at/invoice/02p00", IsNullable = false)]public enum    
SectorType
{
    [System.Xml.Serialization.XmlEnumAttribute("01")]
    Item01,
    [System.Xml.Serialization.XmlEnumAttribute("02")]
    Item02,
    [System.Xml.Serialization.XmlEnumAttribute("03")]
    Item03,
    [System.Xml.Serialization.XmlEnumAttribute("04")]
    Item04,
    [System.Xml.Serialization.XmlEnumAttribute("05")]
    Item05,
    [System.Xml.Serialization.XmlEnumAttribute("06")]
    Item06,
    [System.Xml.Serialization.XmlEnumAttribute("07")]
    Item07,
    [System.Xml.Serialization.XmlEnumAttribute("08")]
    Item08,
    [System.Xml.Serialization.XmlEnumAttribute("09")]
    Item09,
    [System.Xml.Serialization.XmlEnumAttribute("99")]
    Item99,
}

Поэтому я хочу проанализировать строку в SectorType:

string s = "88";
SectorType sectorType;
bool result = Enum.TryParse(s, out sectorType);

После этого мой sectorType "88" и результат true, Так что преобразование прошло успешно. Также это работает нормально:

SectorType sectorType = (SectorType)Enum.Parse(typeof (SectorType), "88")

Ценность sectorType является 88,

Вот картинка из отладчика:

MSDN предоставляет следующую информацию:

Метод Enum.TryParse

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

Очевидно, что нет эквивалентного перечислимого объекта (88 (или любое другое число)! = Item01,..., Item09, Item99).

Я думал, что Enums строго типизированы (см. http://www.dotnetperls.com/enum). Это говорит:

Мы видим, что перечисления строго типизированы. Вы не можете присвоить им просто любое значение.

Но ясно, что в моем примере я мог назначить любой номер своему SectorType-Enum, и я действительно не знаю, почему это работает...

Посмотрите, как он работает на .NET Fiddle.

1 ответ

Решение

Со страницы MSDN для Enum.TryParse<TEnum>(string value, ...):

Если значение является строковым представлением целого числа, которое не представляет базовое значение перечисления TEnum, метод возвращает член перечисления, базовым значением которого является значение, преобразованное в целочисленный тип. Если такое поведение нежелательно, вызовите метод IsDefined, чтобы убедиться, что конкретное строковое представление целого числа действительно является членом TEnum.

Другие вопросы по тегам