簡體   English   中英

什么情況下object.ToString()應該返回null?

[英]Under what circumstances should `object.ToString()` return null?

.Net Core object.ToString()定義為public virtual string? ToString(); public virtual string? ToString();

這意味着如下代碼會引發CS8602 “取消引用可能的 null 引用”警告:

object t = "test";
var s = t.ToString();
Console.WriteLine(s.Length); // Warning CS8602

這很容易通過編寫s..Lengtht.ToString();;來解決。 ,但我的問題是:

在什么情況下從object.ToString()的實現返回null是正確的?


答案似乎是:“你永遠不應該從 object.ToString() 返回 null”,這很公平 - 但這確實引發了另一個問題,即“在這種情況下,為什么微軟將其聲明為public virtual string? ToString(); "?


在旁邊:

下面的一些評論表明,由於實現可能錯誤地返回 null,那么返回值必須聲明為string? .

如果這是真的,那么為什么相同的邏輯不適用於ICloneable.Clone() ,它沒有聲明為返回object? ?

這個邏輯肯定會適用於每個返回引用類型的接口方法嗎? 這種方法的任何實現(例如, ICustomFormatter.Format() )理論上都可以返回null - 因此返回值應該可以為空。 但他們不是。


閱讀了 DavidG 提供的鏈接后,我相信該主題的討論回答了我滿意的問題:

https://github.com/dotnet/coreclr/pull/23466

我看不出有人想要anything.ToString()永遠返回null ,但誰知道呢?

那么,我認為object.ToString()被定義為返回一個string? 出於兼容性原因:這從 .NET 的 v1 開始存在,並且始終定義為返回string ,並且作為引用類型的string可以是 null。 “現代”聲明簡單地說:返回的字符串有可能是 null。

還記得這個string? 事情是非常新的,只是元數據:即使它是輸入string (就像在舊版本中一樣),實現仍然可以設法返回 null。

換句話說,全新的 API 可以(並且應該)根據需要使用Nullable注釋,但是對現有庫的重新鍵入必須尊重庫所做的事情。

我說重新輸入是因為它不是真正的輸入,只是表示預期行為的注釋。 這有點類似於 Typescript '注釋' Javascript 代碼的方式:底層類型系統仍然是舊的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM