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 : notnull上IDataAdapter<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)
我认为这个问题与这篇文章中发生的事情非常相似。
请注意,aT? where T : class和 aT? where T : struct在 CLR 中的表示方式非常不同。前者只是 CLR 类型T。CLR 中没有单独的类型来区分T和T?。 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)
| 归档时间: |
|
| 查看次数: |
2290 次 |
| 最近记录: |