即使参数具有非空约束,也会收到有关可为空类型参数的错误

Dyl*_*nSp 8 c# nullable c#-8.0 nullable-reference-types

我有一个通用接口IDataAdapter<T>;接口的实现者应该能够Guid从数据源读取带有ID 的POCO 。IDataAdapter<T>有一个Read(Guid id)我想返回 a 的方法T?,其中 null 表示在数据源中找不到匹配项。然而,即使约束T : notnullIDataAdapter<T>,试图定义该方法给出了错误CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type. Consider adding a 'class', 'struct', or type constraint.为什么我仍然收到此错误,甚至T限制到notnull

代码(应该在 C# 8 环境中<Nullable>enable</Nullable>):

interface IDataAdapter<T> where T : notnull
{
    T? Read (Guid id); // error CS8627
}
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 5

我认为这个问题与这篇文章中发生的事情非常相似。

请注意,aT? where T : class和 aT? where T : struct在 CLR 中的表示方式非常不同。前者只是 CLR 类型TCLR 中没有单独的类型来区分TT? T?在 C# 中只是增加了 C# 编译器的额外编译时间检查。另一方面,后者由 CLR 类型表示Nullable<T>

因此,让我们考虑您的方法:

T? Read (Guid id);
Run Code Online (Sandbox Code Playgroud)

这应该如何在 CLR 中表示?什么是返回类型?编译器不知道T是引用类型还是值类型,因此编译器无法决定方法签名是否应该是:

T Read (Guid id);
Run Code Online (Sandbox Code Playgroud)

或者:

Nullable<T> Read (Guid id);
Run Code Online (Sandbox Code Playgroud)