提问人:User_FSharp1123 提问时间:11/8/2015 更新时间:12/24/2020 访问量:7863
C# 错误,带有 null 条件运算符和 await
C# Error with null-conditional operator and await
问:
我在 C# 中使用新的 null 条件运算符时遇到了一个有趣的 System.NullReferenceException。如果“MyObject”为 null,以下代码会给我一个 NullReferenceException:
await this.MyObject?.MyMethod()
我本来以为如果“MyObject”为null,则根本不会调用“MyMethod”,或者我是否误解了null条件运算符的目的?
答:
80赞
M.kazem Akhgary
11/8/2015
#1
您可以添加 Operator,以便在返回 null 任务时改用 CompletedTask。??
?.
await (this.MyObject?.MyMethod() ?? Task.CompletedTask)
我本来以为,如果“MyObject”为空,则根本不会调用“MyMethod”。
这是真的。运算符返回 null 任务,而不是调用 。之所以出现 null 引用异常,是因为无法等待 null 任务。必须初始化任务。?.
MyMethod
评论
17赞
Elw00t
9/26/2019
我知道这在这一点上已经很老了,但我想做一个小说明,如果返回一些东西,你也可以做一些事情MyMethod()
var output = await (this.MyObject?.MyMethod() ?? Task.FromResult(default(T)));
12赞
Siderite Zackwehdex
12/24/2020
#2
围绕 null 条件的尴尬性进行了大量讨论。您可以在 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);
}
您可以将它们用作:.请注意额外的括号!如果 default(T) 不是默认情况下要返回的值,您甚至可以指定自己的默认值。我见过其他人做类似的事情,并且还在方法中添加了一个额外的参数,该参数将 ConfigureAwait。await (this.MyObject?.MyMethod()).ForAwait()
不知何故,我很想去掉丑陋的括号,但语言不允许(还?
评论