當不同類型的枚舉之間鑄造,是它可能直接從一種類型強制轉換爲其他類似這樣的嗎?
LicenseTypes type;
TypeOfLicense type2;
type2 = (TypeOfLicense)type;
或者是否有必要先將枚舉強制轉換爲int?編譯器不會抱怨,但我想確保在運行時我不會得到某種時髦的轉換異常。
這可能看起來很奇怪,但兩個枚舉在結構和價值上都是相同的。在這種情況下只有類型名稱不同。
當不同類型的枚舉之間鑄造,是它可能直接從一種類型強制轉換爲其他類似這樣的嗎?
LicenseTypes type;
TypeOfLicense type2;
type2 = (TypeOfLicense)type;
或者是否有必要先將枚舉強制轉換爲int?編譯器不會抱怨,但我想確保在運行時我不會得到某種時髦的轉換異常。
這可能看起來很奇怪,但兩個枚舉在結構和價值上都是相同的。在這種情況下只有類型名稱不同。
雖然它是重複的,我也標記過它。你可以做一些簡單的鑄件,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創建擴展方法用於枚舉之間的轉換。 (它是類似問題的接受答案)
沒有,但你可以做到這一點做一些假設...
LicenseTypes type = LicenseTypes.Type1;
TypeOfLicense type2 = TypeOfLicense.Type2;
type2 = (TypeOfLicense)(int)type;
......和這些假設是這樣。我們必須假設LicenseTypes
和TypeOfLicense
基數爲int
。我們還必須假設,從商業的角度來看,將相互背後的價值觀念相互聯繫起來(但從技術角度來看,這並不存在)。
請注意,這適用於其他基本類型,並且可以構建更復雜的轉換,使您可以在不同類型之間進行轉換。
這個假設是正確的,我有兩個相同的枚舉類型,但第一個從新程序集中不可見。現在回想起來,還有其他一些方法可以解決這個問題(使用直接int可以很好地工作),但我沒有時間回去做「正確」的方式。 –
@BasedAsFunk:是的,它是應用程序經常將它們融入到生活中的東西,所以你只要儘可能地解決它們。 –
+1。如果基本類型不同,轉換可能會失去精度(因爲枚舉相同,所以BasedAsFunk可以)。 –
不管你怎麼做,它只是一個整數賦值給另一個變量。請記住,枚舉在內部被視爲整數,因此它沒有區別。
這不完全正確 - 底層類型是任何整數類型。即如果源類型是'enum Noraml {}'目標類型是'enum Small:byte {}',那麼在轉換時您可能會失去精度。 –
在這種情況下你是對的。當兩個枚舉類型不同時它都成立。 –
我看到了另一個問題,但直到現在我纔看到最後的答案。其他一切都比它的複雜程度要複雜得多。 –
@BasedAsFunk,我相信你甚至不需要強制轉換爲'int',你可以使用類似cast的轉換:'LicenseTypes type =(LicenseTypes)TypeOfLicense.value3;' – Habib