2012-10-04 122 views
6

可能重複:
convert an enum to another type of enum鑄造枚舉之間在C#

當不同類型的枚舉之間鑄造,是它可能直接從一種類型強制轉換爲其他類似這樣的嗎?

LicenseTypes type; 
TypeOfLicense type2; 

type2 = (TypeOfLicense)type; 

或者是否有必要先將枚舉強制轉換爲int?編譯器不會抱怨,但我想確保在運行時我不會得到某種時髦的轉換異常。

這可能看起來很奇怪,但兩個枚舉在結構和價值上都是相同的。在這種情況下只有類型名稱不同。

回答

5

雖然它是重複的,我也標記過它。你可以做一些簡單的鑄件,beucase基礎類型爲int,你可以這樣做:

LicenseTypes type = (LicenseTypes)TypeOfLicense.value3; 

這裏type將舉行值爲「0」;

假設您有:

public enum LicenseTypes 
{ 
    value1, 
    value2, 
} 
public enum TypeOfLicense 
{ 
    value3, 
    value4, 
    value5 
} 

但是,如果你試圖鑄造TypeOfLicence.value5那麼變量type將持有的int值2

LicenseTypes type = (LicenseTypes)TypeOfLicense.value5; 

您也可以看看這個link創建擴展方法用於枚舉之間的轉換。 (它是類似問題的接受答案)

+0

我看到了另一個問題,但直到現在我纔看到最後的答案。其他一切都比它的複雜程度要複雜得多。 –

+0

@BasedAsFunk,我相信你甚至不需要強制轉換爲'int',你可以使用類似cast的轉換:'LicenseTypes type =(LicenseTypes)TypeOfLicense.value3;' – Habib

3

沒有,但你可以做到這一點做一些假設...

LicenseTypes type = LicenseTypes.Type1; 
TypeOfLicense type2 = TypeOfLicense.Type2; 

type2 = (TypeOfLicense)(int)type; 

......和這些假設是這樣。我們必須假設LicenseTypesTypeOfLicense基數爲int。我們還必須假設,從商業的角度來看,將相互背後的價值觀念相互聯繫起來(但從技術角度來看,這並不存在)。

請注意,這適用於其他基本類型,並且可以構建更復雜的轉換,使您可以在不同類型之間進行轉換。

+0

這個假設是正確的,我有兩個相同的枚舉類型,但第一個從新程序集中不可見。現在回想起來,還有其他一些方法可以解決這個問題(使用直接int可以很好地工作),但我沒有時間回去做「正確」的方式。 –

+0

@BasedAsFunk:是的,它是應用程序經常將它們融入到生活中的東西,所以你只要儘可能地解決它們。 –

+0

+1。如果基本類型不同,轉換可能會失去精度(因爲枚舉相同,所以BasedAsFunk可以)。 –

0

不管你怎麼做,它只是一個整數賦值給另一個變量。請記住,枚舉在內部被視爲整數,因此它沒有區別。

+0

這不完全正確 - 底層類型是任何整數類型。即如果源類型是'enum Noraml {}'目標類型是'enum Small:byte {}',那麼在轉換時您可能會失去精度。 –

+0

在這種情況下你是對的。當兩個枚舉類型不同時它都成立。 –