簡體   English   中英

帶有空條件運算符和等待的 C# 錯誤

[英]C# Error with null-conditional operator and await

我在 C# 中使用新的空條件運算符時遇到了一個有趣的 System.NullReferenceException。 如果“MyObject”為空,以下代碼給我一個 NullReferenceException:

await this.MyObject?.MyMethod()

我原以為如果“MyObject”為空,就不會調用“MyMethod”,或者我誤解了空條件運算符的目的?

可以加?? 運營商所以如果?. 返回空任務使用 CompletedTask 代替。

await (this.MyObject?.MyMethod() ?? Task.CompletedTask)

我原以為如果“MyObject”為空,就不會調用“MyMethod”。

確實如此。 ?. 運算符返回空任務而不是調用MyMethod 出現空引用異常是因為您不能等待空任務。 任務必須被初始化。

很多討論都圍繞着 await 中空條件的尷尬進行。 您可以在 C# 提案Champion "Null-conditional await" #35 中看到其中的一些內容。 雖然接受的答案有效,但我相信兩種擴展方法更好地封裝了行為:

public static Task ForAwait(this Task task)
{
    return task ?? Task.CompletedTask;
}

public static Task<T> ForAwait<T>(this Task<T> task, T defaultValue = default)
{
    return task ?? Task.FromResult(defaultValue);
}

您可以將它們用作: await (this.MyObject?.MyMethod()).ForAwait() 注意額外的括號! 您甚至可以指定自己的默認值,如果 default(T) 不是您想要默認返回的值。 我見過其他人做了類似的事情,並在方法中添加了一個額外的參數來配置等待。

我很想擺脫丑陋的括號,不知何故,但語言不允許(還?)。

暫無
暫無

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

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