C# 调用异步方法时,对象引用未设置为对象的实例

C# 调用异步方法时,对象引用未设置为对象的实例,c#,C#,Twitter不通过其RESTAPI提供用户生日。因此,我准备了一个可为空的DateTime属性 我还为所有社交网络服务准备了一个接口。其中大多数是异步任务方法 但我无法传递这个错误:对象引用未设置为对象的实例,即使我没有使用该对象 对于Twitter服务,接口方法GetUserBirthDayAsync的实现如下: public Task<DateTime?> GetUserBirthDayAsync(){ return null; // because twitter d

Twitter不通过其RESTAPI提供用户生日。因此,我准备了一个可为空的DateTime属性

我还为所有社交网络服务准备了一个接口。其中大多数是异步任务方法

但我无法传递这个错误:对象引用未设置为对象的实例,即使我没有使用该对象

对于Twitter服务,接口方法GetUserBirthDayAsync的实现如下:

public Task<DateTime?> GetUserBirthDayAsync(){
    return null; // because twitter does not provide user birthday
}
将值设置为BirthDate变量时出错

发生了什么事?导致异常的原因是什么?

请尝试以下操作:

public Task<DateTime?> GetUserBirthDayAsync()
{
    return Task.Run(() => (DateTime?)null);
}
公共任务GetUserBirthDayAsync() { 返回任务。运行(()=>(日期时间?)null); } 或者,做同样事情的更好方法:

public Task<DateTime?> GetUserBirthDayAsync()
{
    return Task.FromResult<DateTime?>(null);
}
公共任务GetUserBirthDayAsync() { 返回Task.FromResult(空); }
当您只返回
null
时,这意味着您的任务是
null
,而不是异步方法的结果。

您调用了await on null。我想你心里有这样的想法:

public Task<DateTime?> GetUserBirthDayAsync(){
    return Task.Run(() => (DateTime?)null); // because twitter does not provide user birthday like faceBK
}
公共任务GetUserBirthDayAsync(){ return Task.Run(()=>(DateTime?)null);//因为twitter不像faceBK那样提供用户生日 } 即使我没有使用对象

是的,您正在使用该对象。
null
对象是从
GetUserBirthDayAsync()
返回的
任务。当您尝试等待此任务时,您可以使用它

因此,
NullReferenceException
wait
(或编译器为其创建的代码)引发

因此,您可能要做的是返回一个
任务
,该任务返回一个
null
作为结果类型:

public Task<DateTime?> GetUserBirthDayAsync(){
    return Task.Run(() => (DateTime?)null);
}
公共任务GetUserBirthDayAsync(){ 返回任务。运行(()=>(日期时间?)null); }
另一种方法是只使用
任务。FromResult(null)

作为

公共任务GetUserBirthDayAsync() { 返回Task.FromResult(空); }

创建已使用成功完成的任务 指定的结果


与其他选项基本相同,但我觉得它看起来更干净。

Vogt你说得对,我就是这么想的。谢谢,它现在可以工作了。
任务。FromResult(null)
将是一个更好的方式来陈述同样的事情。@spender添加了您的示例。请随意编辑答案,如果您认为可以改进!我使用wait是因为我使用的是依赖注入,我不知道我使用的是TwitterService还是FacebookService,它实际上返回的是生日。
public Task<DateTime?> GetUserBirthDayAsync(){
    return Task.Run(() => (DateTime?)null);
}
public Task<DateTime?> GetUserBirthDayAsync()
{
    return Task.FromResult<DateTime?>(null);
}