Convert.ToString(null)
回報爲什麼Convert.ToString(null)在您投射null時返回不同的值?
null
如我所料。
但
Convert.ToString(null as object)
回報
""
爲什麼這些不同呢?
Convert.ToString(null)
回報爲什麼Convert.ToString(null)在您投射null時返回不同的值?
null
如我所料。
但
Convert.ToString(null as object)
回報
""
爲什麼這些不同呢?
還有的ToString
2個重載這裏都有了用武之地
Convert.ToString(object o);
Convert.ToString(string s);
C#編譯器基本上是試圖挑最具體的超載將與輸入工作。 A null
值可轉換爲任何參考類型。在這種情況下,string
比object
更具體,因此它將被選爲勝利者。
在null as object
中,您已將表達式的類型固化爲object
。這意味着它不再與string
過載兼容,編譯器會選擇object
過載,因爲它是唯一的兼容過載。
C#語言規範第7.4.3節介紹瞭如何實現這種打破僵局的細節。
繼續從JaredPar's excellent overload resolution回答 - 問題依然存在「爲什麼Convert.ToString(string)
返回null,但是Convert.ToString(object)
返回string.Empty
」?
Convert.ToString(String)返回 「指定的字符串實例;不執行任何實際的轉換。」
Convert.ToString(object)返回「值的字符串表示形式,如果值爲null,則返回String.Empty。」
編輯: 至於這是否是一個「在規範的錯誤」,「非常糟糕的API設計」,「爲什麼卻規定這樣的」,等等 - 我會在一些理由進行拍攝爲什麼我不認爲這是件大事。
System.Convert
具有用於每個基地類型轉換爲本身方法。這很奇怪 - 因爲不需要或不可能進行轉換,所以方法最終只返回參數。 Convert.ToString(string)
表現相同。我認爲這些代碼生成場景在這裏。Convert.ToString(object)
通過時有3個選擇null
。拋出,返回null或返回string.Empty。投擲會很糟糕 - 加上這些用於生成代碼的假設是非常重要的。返回null需要你的調用者進行空檢查 - 再次,在生成的代碼中不是一個好選擇。返回string.Empty似乎是一個合理的選擇。System.Convert
的其餘部分處理值類型 - 具有默認值。Convert.ToString(string)
意味着打破「無實際轉換」規則。由於System.Convert
是一個靜態工具類,每個方法都可以在邏輯上視爲自己的方法。很少有真實世界的場景,這種行爲應該是「令人驚訝的」,所以讓可用性勝過(可能的)正確性。說這是規範中的錯誤是否公平? – 2012-04-27 18:42:06
,它不回答爲什麼它是這樣的。說它的行爲是這樣的,因爲它被記錄爲這樣的行爲是重複的。 – CodesInChaos 2012-04-27 18:42:30
@JohnMacIntyre IMO可以說它是非常糟糕的API設計。 – CodesInChaos 2012-04-27 18:43:28
好的。所以它使用一個超載而不是另一個。說得通。但是,這兩種重載不應該返回相同的東西嗎? +1 btw。 – 2012-04-27 18:22:00
@JohnMacIntyre - 這取決於開發團隊而不是編譯器。 – JonH 2012-04-27 18:22:57
+1很好的解釋。 – JonH 2012-04-27 18:23:28