C# 错误,带有 null 条件运算符和 await

C# Error with null-conditional operator and await

提问人:User_FSharp1123 提问时间:11/8/2015 更新时间:12/24/2020 访问量:7863

问:

我在 C# 中使用新的 null 条件运算符时遇到了一个有趣的 System.NullReferenceException。如果“MyObject”为 null,以下代码会给我一个 NullReferenceException:

await this.MyObject?.MyMethod()

我本来以为如果“MyObject”为null,则根本不会调用“MyMethod”,或者我是否误解了null条件运算符的目的?

C# nullreferenceException 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()

不知何故,我很想去掉丑陋的括号,但语言不允许(还?