2015-09-10 184 views
6

我有一個關於鑄造爲空的枚舉的問題。這裏是一個代碼:鑄造爲可空枚舉

enum Digits 
{ 
    One = 1, 
    Two = 2 
} 

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

它給我行#11。
但是,如果我省略'?'符號在那一行,它給出了正確的結果「一」,但我不想失去'可空性'。
作爲解決方法,我現在使用var en = (Digits?) (int?) obj;,它的工作原理雖然我不確定這種解決方案的完全正確性。

但我不知道爲什麼在第一種情況下拋出可空枚舉失敗?

我預計,鑄造可空類型的動作如下:
- 轉換成非可空類型,如果成功,則轉換爲可空類型
- 如果null傳遞那麼結果將是null以及
但這似乎是不正確的。

+5

又見HTTP:/ /stackoverflow.com/questions/5199419/c-sharp-cast-object-of-type-in​​t-to-nullable-enum – simonalexander2005

回答

6

您正在與盒裝int值。拆箱它放回int第一:

var en = (Digits?) (int) obj; // note "(int)" 

如果obj可以分配給null可以使用三元運算

Digits? en = null == obj ? null : (Digits?) (int) obj; 
0

試試這個:

Digits en; 
Enum.TryParse(obj.ToString(), out en); 
+2

其他e是可爲空的枚舉?你的答案適合質疑嗎? – Xaruth

+1

'數字en;數字? result = Enum.TryParse(obj.ToString(),out en)? en:(Digits?)null;' – Corak