[英]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.