2012-07-01 23 views
11

我讀到了一個關於如何通過爲您使用的每種域類型創建數據類型來避免在代碼中使用錯誤的域數據的有用技巧。通過這樣做,編譯器將防止您意外地混合您的類型。有沒有什麼辦法在C#中隱式構造一個類型?

例如,定義這些:

public struct Meter 
{ 
    public int Value; 

    public Meter(int value) 
    { 
     this.Value = value; 
    } 
} 

public struct Second 
{ 
    public int Value; 

    public Second(int value) 
    { 
     this.Value = value; 
    } 
} 

允許,因爲他們是獨立的數據類型,我不會混淆米和秒。這太好了,我可以看到它有多有用。我知道你仍然需要定義運算符重載來處理這些類型的任何類型的算術,但爲了簡單起見,我將其留在了外面。

我用這種方法遇到的問題是,爲了使用這些類型,我需要使用完整的構造每一次,像這樣:

Meter distance = new Meter(5); 

有沒有在C#中的任何方式,我可以使用建築的同一種模式,一個System.Int32使用,就像這樣:

Meter distance = 5; 

我試圖創建一個隱式轉換,但似乎這將需要的類型的Int32的一部分,而不是我的自定義類型。我不能將擴展方法添加到Int32,因爲它需要是靜態的,所以有什麼辦法可以做到這一點?

+0

你是什麼意思,你不能添加擴展方法到'Int32',因爲它會是靜態的? (整個擴展方法的意義在於它們像是實例方法一樣操作,這對於int等基本類型是完全適用的。) –

+0

我認爲我需要將隱式運算符轉換作爲靜態方法添加到Int32中,將靜態方法添加到現有類型(僅限實例方法)。無論如何,肯德爾弗雷得到了我正在尋找的正確答案。 –

+0

我同意這是你正在尋找的答案。但我仍然不明白「靜態方法」的含義。所有意圖和目的的擴展方法就像實例方法一樣。所以,爲了討論的緣故,'米距離= 5.ToMeter();'會工作得很好。 (儘管我同意它不像隱式轉換那樣簡潔) –

回答

24

您可以直接在結構體中指定implicit conversion

public struct Meter 
{ 
    public int Value; 

    public Meter(int value) 
    { 
     this.Value = value; 
    } 

    public static implicit operator Meter(int a) 
    { 
     return new Meter(a); 
    } 
} 

public struct Second 
{ 
    public int Value; 

    public Second(int value) 
    { 
     this.Value = value; 
    } 

    public static implicit operator Second(int a) 
    { 
     return new Second(a); 
    } 
} 
+0

完美!我以int(米m)的形式嘗試了一個隱式運算符,不知道爲什麼我沒有以其他方式嘗試。哇。謝謝! –

相關問題