С# литой объект типа int для обнуления перечисления
Мне просто нужно убрать объект с нулевым перечислением. Объектом может быть перечисление, null или int. Спасибо!
public enum MyEnum { A, B }
void Put(object value)
{
System.Nullable<Myenum> val = (System.Nullable<MyEnum>)value;
}
Put(null); // works
Put(Myenum.B); // works
Put(1); // Invalid cast exception!!
Ответы
Ответ 1
Как насчет:
MyEnum? val = value == null ? (MyEnum?) null : (MyEnum) value;
Приведение из бокса int
в MyEnum
(если value
не равно null), а затем использовать неявное преобразование от MyEnum
до Nullable<MyEnum>
.
Это хорошо, потому что вам разрешено распаковываться из вложенной формы перечисления в свой базовый тип или наоборот.
Я считаю, что на самом деле это конверсия, которая не гарантируется работой по спецификации С#, но гарантированно работает по спецификации CLI. Так что пока вы используете свой код С# в реализации CLI (что вы будете:), все будет хорошо.
Ответ 2
Это происходит потому, что вы распаковываете и выполняете литье за одну операцию, что недопустимо. Вы можете только удалить тип для того же типа, который помещен внутри объекта.
Подробнее, я рекомендую прочитать блог Eric Lippert: Представление и идентификация.
Ответ 3
Когда вы присваиваете значение типу с нулевым значением, вы должны знать, что он не совпадает с базовым типом (по крайней мере, в этом случае). Поэтому, чтобы выполнить бросок, вам нужно сначала распаковать:
void Put(object value)
{
if (value != null)
{
System.Nullable<Myenum> val = (System.Nullable<MyEnum>)(MyEnum)value;
}
}