簡體   English   中英

告訴調用者一個`異步任務<t> ` 方法可能返回 null</t>

[英]Tell the caller that a `async Task<T>` method may return null

我的情況類似於描述的 Proper nullable annotation for async generic method that may return default(T)

但是,我想知道讓調用者知道“返回值”可能是 null 的正確方法。

    public async Task<T> GetAsync<T>()
    {
        // sometimes returns default(T)!;
    }

如果這不是異步方法,我可以使用 MaybeNull 屬性。

    [return: MaybeNull]
    public T Get<T>()
    {
        // sometimes returns default(T)!;
    }

如果它不是通用的,我可以使用? 句法。

    public async Task<string?> GetAsync()
    {
        // sometimes returns default(string)!;
    }

有沒有辦法讓調用者知道它可能是 null 而無需添加通用約束?

編輯:澄清我的意思是讓編譯器知道任務中的值可能是 null。 我想反過來也是正確的。 我最感興趣的是它應該如何與新的 C# 可空引用語法一起工作。

我可以做這樣的事情就好了

    var a = await GetAsync<string?>(); // a is null
    var b = await GetAsync<int?>(); // b is null
    var c = await GetAsync<string>(); // c is null.  Wait string is not supposed to be null and the compiler won't warn you if you use it!
    var d = await GetAsync<int>(); // d is 0

編輯:我可以做這樣的事情就好了

    var a = await Get<string?>(); // a is null
    var b = await Get<int?>(); // b is null
    var c = await Get<string>(); // c is null.  
    var d = await Get<int>(); // d is 0

Nullable 引用類型的建議:如何指定“T?” 類型不限於 class 或結構類似,但可以修改 Box class 以提供正確的警告,我無法更改任務的實現。

在 C# 8 中,您無法表達這一點,因為您無法將[MaybeNull]屬性應用於Task<T>的類型參數。

在 C# 9 中,您可以只使返回類型為空。

public async Task<T?> GetAsync<T>()
{
    // sometimes returns default(T)!;
}

這里類似的主題: Nullable type as a generic parameter possible?

這里的問題是我們不知道T是什么類型,我的意思是它是 class 還是結構。 如果它總是比我建議使用Nullable<T>T? 有約束where T: struct 但是如果它可以是 class 根據定義 class 可以是 null 因為它是引用類型。

如果沒有約束,您可以告訴調用者他會得到什么的唯一方法是使用/// <summary>作為 itsme86 提到的或給方法更有意義的名稱,例如。 GetOrDefaultAsync()

編輯:參考 Stefan 的回答,使用一些函數式編程技巧並為返回類型創建包裝器是一個很好的解決方案,該類型指示返回的 object 是否具有價值。

暫無
暫無

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

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