InvalidCastException пытается привести из упакованного int к обнуляемому перечислению
У меня есть перечисление:Foo
public enum Foo { Alpha, Bravo, Charlie }
Если я попытаюсь следующий бросок из коробкиint
кFoo?
Я получаю:InvalidCastException
var x = (Foo?)(object)1;
Это привело меня к некоторым экспериментам ...
var x = (Foo)(object)1; // succeeds
var x = (long)(object)1; // fails
var x = (long?)(object)1; // fails
var x = (long)1; // succeeds
var x = (long?)1; // succeeds
var x = (int)(object)1; // succeeds
var x = (int?)(object)1; // succeeds
Это говорит мне о том, что вы можете разыграть в штучной упаковкеint
к перечислению, но не кlong
, и тыне могу конвертировать в штучной упаковкеint
к любому виду обнуляемому, кроме.int?
Кстати, причина, по которой ям кастингint
вobject
во-первых, яЯ действительно пытаюсь изгнать изint
к универсальному параметруTValue
, как это:
var x = (TValue)(object)1;
Если бы я неиметь(object)
это нет компилировать. (Видеть этосообщение в блоге Эрика Липперта для деталей.)
Вопросы
Почему вы можете конвертировать в штучной упаковкеint
для перечисления, но не для обнуляемого перечисления (и не дляlong
ниlong?
)?
Какие'самый простой способ переписатьvar x = (TValue)(object)1;
так что он компилируется, работает во время выполнения и является быстродействующим (при условииTValue
определяется какFoo?
во время выполнения)?