2013-07-22 101 views
2

我學會了爲我的類使用隱式運算符。int的隱式運算符?

現在我想要做這樣的事情:

public static implicit operator string(int val) 
{ 
    return "The value is: " + val.ToString(); // just an nonsense example 
} 

然而這是錯誤的。編譯器說:

用戶定義的轉換必須轉換或從封閉類型

我怎樣才能解決這個?

我的目標是能夠像這樣運行代碼:

int x = 50; 
textbox1.Text = x; // without using .ToString() or casting 
+0

爲什麼這是錯的?在我看來,這是完全正確的! –

+0

@RomanoZumbé我更新了我的問題。當我嘗試這樣做時,編譯器會說「用戶定義的轉換必須轉換爲包圍類型或從包含類型轉換」 – Kamil

+0

您無法解決此問題,因爲您必須*在轉換的類中實現隱式運算符作爲靜態方法 - 當然,你不能改變System.Int32的實現。 –

回答

6

您不能添加操作類無論是參數或運算符的返回類型之外。
換句話說:您不能添加一個運算符,該運算符在您不能控制的兩種類型之間進行轉換。

你的編譯器錯誤是對此非常明確:

用戶定義的轉換必須轉換或從封閉類型

所以,你正試圖在這裏實現的是簡單不可能。
您的最佳選擇可能是執行轉換並返回stringint上的擴展方法。

+0

我明白。有沒有辦法解決這個問題,以獲得相同的效果? – Kamil

+0

@Kamil:你不能。但是,請參閱我的更新答案中的最後一句,以獲取其他方法。 –

+0

我已經做了。我試圖儘量減少我的代碼,避免在任何地方編寫'.MyExtension()'。也許我會寫自己的類,並把這個整數內。謝謝。 – Kamil

1

您需要添加隱式運算符作爲類的成員。由於您無法控制int課程;不可能將類隱式運算符添加到int類中。

您可以爲int寫一個包裝,或者創建一個新的擴展方法將int直接轉換爲字符串(已經定義爲ToString())。

2

您可能想要考慮一種替代方法。

你可以在Control編寫擴展方法,像這樣:

public static class ControlExt 
{ 
    public static void SetText(this Control self, object obj) 
    { 
     self.Text = obj.ToString(); 
    } 
} 

那麼你的代碼將變成:

int x = 50; 
textbox1.SetText(x); 

它將與任何類型,而不僅僅是整數當然工作:

textbox1.SetText(DateTime.Now); 
+0

我喜歡它。你向我展示了我的想法是多麼的落後:) – Kamil