值类型中引用类型的可空性与目标类型不匹配。

7

我正在尝试使用可空引用类型和Entity Framework Core。该方法应异步返回可空的User,但编译器报错。

CS8619
Nullability of reference types in value doesn’t match target type.

源代码如下:

public class UserRepository : IUserRepository
{
    private readonly ApplicationDbContext DbContext;

    public UserRepository(ApplicationDbContext dbContext)
    {
        DbContext = dbContext;
    }

    public Task<User?> GetByEmailAddress(string emailAddress) =>
        DbContext.Users.SingleOrDefaultAsync(x => x.EmailAddress == emailAddress);
}

如何正确编写此代码?

更新,我预计开启可空选项会改变 SingleOrDefaultAsync 的含义,使其实际上意味着 Task<{非空用户}> 所以如果我将方法设为异步的(如下面的代码),那么 C# 编译器将从 Task<> 中取出 User 并将其转换为 User?

    public async Task<User?> GetByEmailAddress(string emailAddress) =>
        await DbContext.Users.SingleOrDefaultAsync(x => x.EmailAddress == emailAddress);

有没有其他方法可以不必将我的方法设为 async 就能实现这个功能?


为什么你的用户不是可空的?(为什么你声明该方法返回 User? ?) - Caius Jard
是不是 IUserRepository 承诺的是 Task<User> 而不是 Task<User?> - Marc Gravell
@CaiusJard 我猜测 OP 正在尝试使用新的 C# 8.0 特性——可空引用类型:https://learn.microsoft.com/en-us/dotnet/csharp/tutorials/nullable-reference-types - ZorgoZ
@MarcGravell - 不,接口上的方法签名与类相同。我已更新问题,并提供了一些很有趣的信息。 - Peter Morris
1个回答

5
我认为这是Github上Roslyn编译器指定的一个问题:
允许在可空的Task<T>类型参数中从异步方法返回null。(原文链接)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接