現在我與Guid
s。無法將類型'X'隱式轉換爲'字符串' - 何時以及如何確定它「不能」?
我當然記得整個代碼在某些地方這種隱式轉換的工作原理,在其他地方則沒有。到目前爲止,我沒有看到這種模式。
編譯器如何決定它何時不能?我的意思是,類型方法Guid.ToString()
存在,不需要在需要此轉換時調用該方法嗎?
有人可以告訴我在什麼情況下自動完成這種轉換,以及何時必須明確地撥打myInstance.ToString()
?
現在我與Guid
s。無法將類型'X'隱式轉換爲'字符串' - 何時以及如何確定它「不能」?
我當然記得整個代碼在某些地方這種隱式轉換的工作原理,在其他地方則沒有。到目前爲止,我沒有看到這種模式。
編譯器如何決定它何時不能?我的意思是,類型方法Guid.ToString()
存在,不需要在需要此轉換時調用該方法嗎?
有人可以告訴我在什麼情況下自動完成這種轉換,以及何時必須明確地撥打myInstance.ToString()
?
總之,當有定義的隱性或顯性的轉換操作符:
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();
}
}
只是看看自己。不能相信我在C#中這些年來都錯過了這件事。我想從來不需要它......感謝讓我今天學到新東西。 – User 2009-04-15 11:45:23
唯一的地方,您可以有效地不需要調用toString()自己是連接字符串時。
Guid g;
int i;
string s = "Hello "+g+' '+i;
然後有一些情況下呼叫由.NET Framework製作,如String.Format()。
除此之外,如果編譯器已知是兼容的(例如,基類或實現接口或通過顯式編碼的轉換運算符),編譯器將只轉換類型。當你使用一個轉換並且編譯器知道這些類型不兼容時(例如不在同一個繼承行中,而不是在接口中),它也會說它不能轉換它。泛型類型參數也是如此。
不,不存在從GUID
到String
的隱式轉換,因此在代碼中根本不起作用。
它只適用於存在明確轉換的地方,但轉換可能不會非常明顯。例如,當您連接字符串:
string id = "--" + guidValue + " : " + num;
這可能看起來像從GUID
到String
的隱式轉換,但事實並非如此。被實際產生的代碼看起來是這樣的:
string id = String.Concat(new object[] { "--", guidValue, " : ", num });
所有操作數被鑄造到該類型Object
並放置在陣列中。然後String.Concat
方法調用數組中每個項目的ToString
方法以獲取它們的字符串表示形式。
(添加評論爲您的問題) – 2009-04-15 12:05:00
試錯。試錯。 – Will 2009-04-15 12:30:46