С# литой объект типа 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;
    }
}