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

时间:2016-06-24 11:06:20

标签: c#

Twitter不通过REST API为用户提供生日。因此我准备了可以为空的DateTime属性。

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

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

接口方法GetUserBirthDayAsync实现如下Twitter服务:

public Task<DateTime?> GetUserBirthDayAsync(){
    return null; // because twitter does not provide user birthday like faceBK
}

这就是我使用方法的方法:

DateTime? BirthDate = await socialNetworkService.GetUserBirthDayAsync();

将值设置为BirthDate变量时发生错误。

发生了什么事?是什么导致了这个问题。

4 个答案:

答案 0 :(得分:8)

试试这个:

public Task<DateTime?> GetUserBirthDayAsync()
{
    return Task.Run(() => (DateTime?)null);
}

或者,更好的方法:

public Task<DateTime?> GetUserBirthDayAsync()
{
    return Task.FromResult<DateTime?>(null);
}

当您只返回null时,您的任务为null,而不是异步方法的结果。

答案 1 :(得分:4)

另一种方法是使用Task.FromResult<DateTime?>(null)

作为

public Task<DateTime?> GetUserBirthDayAsync()
{
    return Task.FromResult<DateTime?>(null);
}

MSDN Documentation

  

创建一个已成功完成的任务   指定的结果。

与其他选项几乎相同,但恕我直言,它看起来更清洁。

答案 2 :(得分:1)

你在null上调用await。我想你有这样的想法:

public Task<DateTime?> GetUserBirthDayAsync(){
    return Task.Run(() => (DateTime?)null); // because twitter does not provide user birthday like faceBK
}

答案 3 :(得分:1)

  

即使我没有使用对象

是的, 使用该对象。 null的对象是您从Task<DateTime?>返回的GetUserBirthDayAsync()。并且当您尝试await此任务时使用它。

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

所以你可能想做的就是返回Task<DateTime?>作为结果类型返回null

public Task<DateTime?> GetUserBirthDayAsync(){
    return Task.Run(() => (DateTime?)null);
}