2012-04-27 27 views

回答

139

還有的ToString 2個重載這裏都有了用武之地

Convert.ToString(object o); 
Convert.ToString(string s); 

C#編譯器基本上是試圖挑最具體的超載將與輸入工作。 A null值可轉換爲任何參考類型。在這種情況下,stringobject更具體,因此它將被選爲勝利者。

null as object中,您已將表達式的類型固化爲object。這意味着它不再與string過載兼容,編譯器會選擇object過載,因爲它是唯一的兼容過載。

C#語言規範第7.4.3節介紹瞭如何實現這種打破僵局的細節。

+15

好的。所以它使用一個超載而不是另一個。說得通。但是,這兩種重載不應該返回相同的東西嗎? +1 btw。 – 2012-04-27 18:22:00

+2

@JohnMacIntyre - 這取決於開發團隊而不是編譯器。 – JonH 2012-04-27 18:22:57

+0

+1很好的解釋。 – JonH 2012-04-27 18:23:28

61

繼續從JaredPar's excellent overload resolution回答 - 問題依然存在「爲什麼Convert.ToString(string)返回null,但是Convert.ToString(object)返回string.Empty」?

而答案是...因爲the docsso

Convert.ToString(String)返回 「指定的字符串實例;不執行任何實際的轉換。」

Convert.ToString(object)返回「值的字符串表示形式,如果值爲null,則返回String.Empty。」

編輯: 至於這是否是一個「在規範的錯誤」,「非常糟糕的API設計」,「爲什麼卻規定這樣的」,等等 - 我會在一些理由進行拍攝爲什麼我不認爲這是件大事。

  1. System.Convert具有用於每個基地類型轉換爲本身方法。這很奇怪 - 因爲不需要或不可能進行轉換,所以方法最終只返回參數。 Convert.ToString(string)表現相同。我認爲這些代碼生成場景在這裏。
  2. Convert.ToString(object)通過時有3個選擇null。拋出,返回null或返回string.Empty。投擲會很糟糕 - 加上這些用於生成代碼的假設是非常重要的。返回null需要你的調用者進行空檢查 - 再次,在生成的代碼中不是一個好選擇。返回string.Empty似乎是一個合理的選擇。System.Convert的其餘部分處理值類型 - 具有默認值。
  3. 返回null是否更「正確」是值得商榷的,但string.Empty肯定更有用。更改Convert.ToString(string)意味着打破「無實際轉換」規則。由於System.Convert是一個靜態工具類,每個方法都可以在邏輯上視爲自己的方法。很少有真實世界的場景,這種行爲應該是「令人驚訝的」,所以讓可用性勝過(可能的)正確性。
+0

說這是規範中的錯誤是否公平? – 2012-04-27 18:42:06

+3

,它不回答爲什麼它是這樣的。說它的行爲是這樣的,因爲它被記錄爲這樣的行爲是重複的。 – CodesInChaos 2012-04-27 18:42:30

+2

@JohnMacIntyre IMO可以說它是非常糟糕的API設計。 – CodesInChaos 2012-04-27 18:43:28