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, и тыcannot конвертировать в штучной упаковкеint к любому виду обнуляемой, кромеint?.

Кстати, причина, по которой яint вobject Во-первых, я действительно пытаюсь разыгратьint к универсальному параметруTValue, как это:

var x = (TValue)(object)1;

Если бы у меня не было(object), он не будет компилироваться. (Видеть этосообщение в блоге Эрика Липперта для деталей.)

Questions

Why can you convert from a boxed int to an enum, but not to a nullable enum (and not to a long nor a long?)?

What's the easiest way to rewrite var x = (TValue)(object)1; so that it compiles, works at runtime, and is performant (assuming TValue is determined to be a Foo? at runtime)?

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

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