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)?