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.