2009-04-15 39 views
16

現在我與Guid s。無法將類型'X'隱式轉換爲'字符串' - 何時以及如何確定它「不能」?

我當然記得整個代碼在某些地方這種隱式轉換的工作原理,在其他地方則沒有。到目前爲止,我沒有看到這種模式。

編譯器如何決定它何時不能?我的意思是,類型方法Guid.ToString()存在,不需要在需要此轉換時調用該方法嗎?

有人可以告訴我在什麼情況下自動完成這種轉換,以及何時必須明確地撥打myInstance.ToString()

+0

(添加評論爲您的問題) – 2009-04-15 12:05:00

+0

試錯。試錯。 – Will 2009-04-15 12:30:46

回答

32

總之,當有定義的隱性或顯性的轉換操作符:

class WithImplicit { 
    public static implicit operator string(WithImplicit x) { 
     return x.ToString();} 
} 
class WithExplicit { 
    public static explicit operator string(WithExplicit x) { 
     return x.ToString(); } 
} 
class WithNone { } 

class Program { 
    static void Main() { 
     var imp = new WithImplicit(); 
     var exp = new WithExplicit(); 
     var none = new WithNone(); 
     string s1 = imp; 
     string s2 = (string)exp; 
     string s3 = none.ToString(); 
    } 
} 
+2

只是看看自己。不能相信我在C#中這些年來都錯過了這件事。我想從來不需要它......感謝讓我今天學到新東西。 – User 2009-04-15 11:45:23

4

唯一的地方,您可以有效地不需要調用toString()自己是連接字符串時。

Guid g; 
int i; 
string s = "Hello "+g+' '+i; 

然後有一些情況下呼叫由.NET Framework製作,如String.Format()

除此之外,如果編譯器已知是兼容的(例如,基類或實現接口或通過顯式編碼的轉換運算符),編譯器將只轉換類型。當你使用一個轉換並且編譯器知道這些類型不兼容時(例如不在同一個繼承行中,而不是在接口中),它也會說它不能轉換它。泛型類型參數也是如此。

4

不,不存在從GUIDString的隱式轉換,因此在代碼中根本不起作用。

它只適用於存在明確轉換的地方,但轉換可能不會非常明顯。例如,當您連接字符串:

string id = "--" + guidValue + " : " + num; 

這可能看起來像從GUIDString的隱式轉換,但事實並非如此。被實際產生的代碼看起來是這樣的:

string id = String.Concat(new object[] { "--", guidValue, " : ", num }); 

所有操作數被鑄造到該類型Object並放置在陣列中。然後String.Concat方法調用數組中每個項目的ToString方法以獲取它們的字符串表示形式。

相關問題