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 次 |
最近记录: |