如何允许C#8中的可空泛型类型作为方法的返回类型?
我有以下代码:如何允许C#8中的可空泛型类型作为方法的返回类型?,c#,generics,nullable-reference-types,C#,Generics,Nullable Reference Types,我有以下代码: public async Task<T> Retrieve<T>() where T : class, ITableEntity { var result = await GetData<T>(); return result.Result as T; // result.Result is object } 公共异步任务检索() 其中T:class,ITableEntity { var result=await Ge
public async Task<T> Retrieve<T>()
where T : class, ITableEntity
{
var result = await GetData<T>();
return result.Result as T; // result.Result is object
}
公共异步任务检索()
其中T:class,ITableEntity
{
var result=await GetData();
返回result.result作为T;//result.result是对象
}
现在,编译器给出了一个警告可能的空引用返回
。我可以用“!”来修复它,但我确实希望允许null,所以这样做似乎是错误的。我真的不知道为什么编译器会假设类意味着不可空,我试着写类?
(我甚至不知道这意味着什么,但它会编译,尽管它给出了相同的警告)
是否可以告诉编译器T可以是可为null的引用类型?我猜它默认为不可空。公共异步任务检索()
其中T:class,ITableEntity
如果希望t
可以为空,那么它不应该是Task
作为返回类型吗?这是否意味着尽管t本身不可以为空,但如果我将其传递到错误的上下文中,会有警告?看起来有点奇怪,我有一个已经可以为空的T,但是我们没有?增加了“一个可空”@IlyaChernomordik,但这就是C#8可空性的全部要点T
不可为空,即使已知T
是引用类型<代码>T?可为空。例如,对于System.String
(一个类):String
是不可为空的,String?
是可为空的。@由于某些原因,这不适用于类级别上的泛型类型参数:RepositoryBase where T:BaseEntity
和方法Task GetAsync(…)
I get error:必须知道可为null的类型参数是值类型或不可为null的引用类型。考虑添加“类”、“结构”或类型约束。< /代码> @ PavelVoronin,听起来好像在项目或类级别上没有启用引用空值;这里的示例:-取消注释#nullable enable
,它工作正常(注意:理想情况下,您应该在csproj中执行此操作,而不是通过#nullable
)是的,刚刚发现了这一点。我必须添加notnull
:RepositoryBase其中T:notnull,BaseEntity