![](/img/trans.png)
[英]Why does the signature of object.ToString state that it can return a null value
[英]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..Length
或t.ToString();;
來解決。 ,但我的問題是:
在什么情況下從object.ToString()
的實現返回null
是正確的?
答案似乎是:“你永遠不應該從 object.ToString() 返回 null”,這很公平 - 但這確實引發了另一個問題,即“在這種情況下,為什么微軟將其聲明為public virtual string? ToString();
"?
在旁邊:
下面的一些評論表明,由於實現可能錯誤地返回 null,那么返回值必須聲明為string?
.
如果這是真的,那么為什么相同的邏輯不適用於ICloneable.Clone()
,它沒有聲明為返回object?
?
這個邏輯肯定會適用於每個返回引用類型的接口方法嗎? 這種方法的任何實現(例如, ICustomFormatter.Format()
)理論上都可以返回null
- 因此返回值應該可以為空。 但他們不是。
閱讀了 DavidG 提供的鏈接后,我相信該主題的討論回答了我滿意的問題:
我看不出有人想要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.