如何在C# 8中允许可空的通用类型作为方法的返回类型?

3
我有如下代码:
public async Task<T> Retrieve<T>()
    where T : class, ITableEntity
{
    var result = await GetData<T>();
    return result.Result as T; // result.Result is object
}

现在编译器会发出警告 Possible null reference return。我可以用 '!' 来修复它,但实际上我确实想允许 null,所以这样做似乎是错误的。我不知道为什么编译器认为类意味着不可为空,我试过写 class?(甚至不知道那是什么意思,但它可以编译,尽管会给出相同的警告)。
有没有可能告诉编译器 T 可以是可空引用类型?我猜默认是不可为空的。

4
如果您希望T可为空,那么返回类型不应该是Task<T>吗? - germi
1个回答

10
public async Task<T?> Retrieve<T>()
    where T : class, ITableEntity

这是否意味着 T 本身是非空的,如果我将其传递到错误的上下文中会出现警告?看起来有点奇怪,因为我已经有一个可为空的 T,但是我们又加了一个“可为空”。 - Ilya Chernomordik
@IlyaChernomordik 但这就是 C# 8 可空性的全部意义;即使 T 已知是引用类型,T 也不是 可空的。T? 是可空的。例如,对于 System.String(一个类):string非可空的,string? 是可空的。 - Marc Gravell
@MarcGravell 由于某种原因,这在类级别的泛型类型参数上不起作用:RepositoryBase<T> where T : BaseEntity,而对于方法 Task<T?> GetAsync(...),我收到错误消息:可空类型参数必须被认为是值类型或非可空引用类型。请考虑添加 'class'、'struct' 或类型约束。 - Pavel Voronin
1
@PavelVoronin,这听起来像是您在项目或类级别上未启用引用空值;示例在此处:https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA+ABATARgLABQGADAAQY4CsA3IQPR0DEAdgK4A27AhsOzKTGY8+hbKQBCXAM4wAoswAuASwUBPUgG8AvqKykASjAAOEKSuirJMgDwAVAHykA7gAsYsUrdIgJ0uYpVVQg1CUjDyJDsAfkcAcRgFAEEpVWYwAAoASlIAXkcFFygIJ1JmGBKAOQgFAEkAWyM+OsEFGAATWQQwY2UIZizaAi0gA= - 取消注释 #nullable enable 即可正常工作(注意:最好在 csproj 中执行此操作,而不是通过 #nullable)。 - Marc Gravell
是的,我刚发现这个问题。我必须添加 notnullRepositoryBase<T> where T : notnull, BaseEntity - Pavel Voronin

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