我有一个关于转换为可以为空的枚举的问题.这是一个代码:
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也是如此
但它似乎不是真的.
你正在使用盒装 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)