2015-02-24 58 views
0

例如,我有一個隨機數,但它可以有「特殊數字」值。類似的東西:我可以將int和enum存儲在一起嗎?

enum XNumber { INFINITY, NEGATIVE, int } 

所以,我可以存儲:

var i = XNumber.INFINITY; 
var i = XNumber.NEGATIVE; 
var i = (XNumber) 1; 
var i = (XNumber) 500; 
var i = (XNumber) -1000; 

如果不是,有什麼我可能做到這一點?

+2

你的意思是'var i =(XNumber)-1000;'應該導致'XNumber.NEGATIVE'? – 2015-02-24 05:53:15

+0

如果@JenishRabadiya是正確的,那麼我的回答(雖然不正確)將需要修改。 – 2015-02-24 05:59:35

回答

2

如果數值匹配爲,則可以向int 施放 enum。請注意,您可以將數值分配給枚舉值。例如,

namespace Test 
{ 
    enum SpecialValue 
    { 
     Zero = 0, 
     Five = 5, 
     Seventy = 70 
    } 

    private void method() 
    { 
     var five = (SpecialValue)5; // == SpecialValue.Five 
     int seventy = (int)SpecialValue.Seventy; // == 70 
    } 
} 
+2

請注意,這些值不必匹配:枚舉類型可以具有其基礎類型的任何值;它不受其成員的限制。 * SpecialValue anyValue =(SpecialValue)42; *完全有效,anyValue的值將爲42. – 2015-02-24 06:06:30

+0

@WillemvanRumpt:你是對的 - 我已經編輯了我的答案。非常感謝評論。 – 2015-02-24 06:10:33

0

最簡單的方法可能是將兩種intenumstruct。您可以定義轉換運算符和算術運算符,以更輕鬆地處理您的類型。

例如

struct XNumber { 
    private enum SpecialValue { Normal, Negative, Infinity} 
    private int value; 
    private SpecialValue kind; 

    public XNumber Infinity = new XNumber { kind = SpecialValue.Infinity }; 
    public XNumber Negative = new XNumber { kind = SpecialValue.Negative }; 

    public static implicit operator XNumber(int value) { 
    if (value < 0) 
     return new XNumber { kind = SpecialValue.Negative }; 
    return new XNumber { value = value }; 
    } 

    // ... 
} 

類似的東西,根據您的確切需要。

如果您不需要int的全部範圍,則另一種方法是對無窮大和負值使用特殊值,並且只需要存儲int。仍然是struct,您仍然應該定義轉換和運算符,以便一切都相符。雖然你可以通過enum得到解決,但是正如Wai Ha Lee所說,我不會推薦它,因爲你基本上有一個自己的類型,它有自己的語義(只是這些碰巧在C#中被enums支持) 。

相關問題