我遇到了以下現象,完全被迷惑了。我正在使用啟用了 nullables 的 C# 10。
default(int?)按預期回傳 null。但是,以下函式回傳任何default(T)內容
public static T? ShouldReturnNull<T>()
{
return default(T?);
}
在ShouldReturnNull<int>()我們得到 0 的情況下。它不應該也回傳 null 嗎?
我的程式中有以下代碼,這成為一個問題:
public T?[] FindKElements(...)
{
var result = new (T, double)?[k];
// ... populate result array,
// possibly including null values...
// return an array containing only the T part or null
return result.Select(e => e is null ? default(T?) : e.Value.Item1).ToArray();
}
當 T 是值型別時,有沒有辦法讓它保持這種通用性但使用適當的空值?編譯器不允許我使用null.default(T?)
uj5u.com熱心網友回復:
在沒有約束where T : struct的情況下,T?并不意味著;它的意思是“ ,但請注意,它不是NRT 意義上的”——并且由于 NRT 空值永遠不會應用于您的值型別場景:它基本上只是意味著; 并且值型別的默認值不是(在任何意義上)。Nullable<T>TnullTTnull
在您需要跨越值型別和參考型別場景(包括支持沒有值的值型別)的“空檢查”的場景中,最簡單的方法通常是忘記Nullable<T>并只跟蹤:
- 我有一個值 (
bool),并且 - 值是多少 (
T)
分別,明確地;這可以通過以下任何方式:
bool SomeMethod(out var T)(HasValue: bool, Value: T) SomeMethod()Maybe<T> SomeMethod()
(其中Maybe<T>只是一個struct由 abool HasValue和 a組成的自定義T Value)
這有效地創建了類似于 的東西Nullable<T>,但它適用于所有值,無論型別如何。與其檢查 null ,不如.HasValue先檢查,如果為 true,則假定該值是有意義的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/485053.html
下一篇:C#-使用LINQ洗掉重復物件
