C # приведение объекта типа int к nullable enum - PullRequest
14 голосов
/ 05 марта 2011

Мне просто нужно иметь возможность привести объект к nullable enum. Объект может быть enum, 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!!

Ответы [ 3 ]

39 голосов
/ 05 марта 2011

Как насчет:

MyEnum? val = value == null ? (MyEnum?) null : (MyEnum) value;

Приведение в штучной упаковке int к MyEnum (если value не равно нулю), а затем используется неявное преобразование из MyEnum в Nullable<MyEnum>.

Это нормально, потому что вы можете распаковать из упакованной формы перечисления в его базовый тип или наоборот.

Я полагаю, что на самом деле это преобразование, которое не гарантированно работает в спецификации C #, но гарантированно работает в спецификации CLI. Так что, пока вы выполняете свой код C # в реализации CLI (которой вы будете :), все будет в порядке.

13 голосов
/ 05 марта 2011

Это потому, что вы распаковываете и кастуете за одну операцию, что недопустимо.Вы можете распаковать тип только для того же типа, который находится внутри объекта.

Для получения дополнительной информации я рекомендую прочитать блог Эрика Липперта: Представление и идентичность .

1 голос
/ 05 марта 2011

Когда вы присваиваете значение обнуляемому типу, вы должны знать, что оно не совпадает с базовым типом (по крайней мере, в этом случае).Таким образом, чтобы выполнить приведение, сначала нужно распаковать:

void Put(object value)
{
    if (value != null)
    {
        System.Nullable<Myenum> val = (System.Nullable<MyEnum>)(MyEnum)value;
    }
}
...