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? во время выполнения)?

Ответы на вопрос(2)

Ваш ответ на вопрос