铸造成可以为空的枚举

Sev*_*ven 6 c# enums

我有一个关于转换为可以为空的枚举的问题.这是一个代码:

enum Digits
{
    One = 1,
    Two = 2
}

void Main()
{
    int one = 1;
    object obj = one;
    var en = (Digits?) obj;
    Console.WriteLine(en);
}
Run Code Online (Sandbox Code Playgroud)

它让我排InvalidCastException在第11行.
但如果我省略'?' 在该行中的符号,它给出了正确的结果"一",但我不想失去"可空性".
作为我现在使用的解决方法var en = (Digits?) (int?) obj;,虽然我不确定这种解决方案的完全正确性,但它仍然有效.

但我想知道为什么在第一种情况下,铸造到可以为空的枚举失败了?

我期望对可空类型的转换如下:
- 转换为非可空类型,如果成功则转换为可空类型
- 如果null传递则结果null也是如此
但它似乎不是真的.

Dmi*_*nko 7

你正在使用盒装 int价值.将其重新装回int第一个:

  var en = (Digits?) (int) obj; // note "(int)"
Run Code Online (Sandbox Code Playgroud)

如果obj可以分配给null你可以使用三元运算符:

  Digits? en = null == obj ? null : (Digits?) (int) obj;
Run Code Online (Sandbox Code Playgroud)