2011-03-04 84 views
11

我只需要能夠將對象轉換爲可以爲null的枚舉。對象可以是枚舉,null或int。謝謝!C#將int類型的對象轉換爲可爲空的枚舉

public enum MyEnum { A, B } 
void Put(object value) 
{ 
    System.Nullable<Myenum> val = (System.Nullable<MyEnum>)value; 
} 

Put(null);  // works 
Put(Myenum.B); // works 
Put(1);  // Invalid cast exception!! 
+0

如果您使用強類型聲明,則可以節省一些麻煩。如果你知道'Put'需要一個'Nullable ',爲什麼要用'object'聲明它呢? – 2011-03-04 21:34:16

+2

@Ilya Kogan,這是Put函數的簡化版本,它處理其他數據類型,而不僅僅是enum – dlsou 2011-03-04 21:38:22

回答

33

如何:

MyEnum? val = value == null ? (MyEnum?) null : (MyEnum) value; 

從盒裝intMyEnum(如果value不爲null),然後使用隱式轉換從MyEnumNullable<MyEnum>演員。

沒關係,因爲你可以從枚舉的盒裝形式到其基礎類型,或反之亦然。

我認爲這實際上是保證由C#規範工作轉換,但保證通過CLI規範工作。所以只要你在CLI實現上運行你的C#代碼(你將會是:)你會沒事的。

+0

這是有效的,謝謝 – dlsou 2011-03-04 21:53:50

+4

+1我每天都發誓我從StackOverflow的Jon Skeet回覆中獲得指導。先生,幹得好。 – JustinMichaels 2013-04-16 17:59:35

+0

更簡單的方法:'MyEnum? val =(MyEnum?)值? null' – Aesir 2017-10-25 16:16:45

11

這是因爲你在一個操作中取消裝箱和投射,這是不允許的。只能將類型取消裝入與對象內部裝入的相同類型。

有關詳細信息,我建議您閱讀Eric Lippert的博客:Representation and Identity

+2

其實並不完全。看到我的答案 - 你*可以*從盒裝'int'解開enum類型(以'int'作爲基礎類型),或者從盒裝枚舉值到其基礎類型。 – 2011-03-04 21:31:22

+0

@Jon:True - 但這也是一個邊緣情況(只適用,因爲在這個特定情況下,「enum」實際上是一個「int」) - 當OP將0.0傳入方法時會發生什麼?或者他們試圖用一種由Int32以外的東西支持的枚舉來使用這種技術?那些仍然會導致問題... – 2011-03-04 21:35:35

+1

然後它會中斷。但OP會說:「對象可以是枚舉,null或int。」換句話說,我給出的解決方案適用於所提出的問題。我們不知道在其他情況下需要什麼樣的行爲。 – 2011-03-04 21:39:35

1

當你將一個值賦給一個可爲空的類型時,你必須意識到它與底層類型不一樣(至少在這種情況下)。因此,爲了演出演員,您需要首先將其取消:

void Put(object value) 
{ 
    if (value != null) 
    { 
     System.Nullable<Myenum> val = (System.Nullable<MyEnum>)(MyEnum)value; 
    } 
} 
+0

我太慢了:) – TheBoyan 2011-03-04 21:30:21

+0

這也行不通。這段代碼有同樣的錯誤:在相同的操作中取消裝箱和投射。 'Put'應該使用'MyEnum?'作爲參數。 – 2011-03-04 21:30:51

+2

+1,因爲它*確實*有效。那些說它不應該*嘗試*它:) – 2011-03-04 21:32:40

相關問題