如何定义同时支持int、string作为泛型参数的可空IAuditEntity接口
报错原因
开启可空引用类型校验后,编译器无法确定泛型参数TKey属于值类型还是引用类型,无法判断TKey?对应Nullable<TKey>(值类型可空包装)还是可空引用类型,因此抛出该错误。
解决方案
方案1:.NET 7 / C# 11 及以上版本(推荐)
C# 11 原生支持无约束泛型参数的可空声明,无需修改原有接口结构即可直接使用:
public interface IAuditEntity<TKey> { TKey? UpdatedBy { get; set; } }
该写法会自动适配两种泛型类型规则:
- 当
TKey为int等值类型时,TKey?自动映射为Nullable<int> - 当
TKey为string等引用类型时,TKey?自动映射为可空引用类型
方案2:兼容 .NET 6 及更早版本
如果项目需要适配低版本框架,可使用[MaybeNull]特性告知编译器属性允许为空:
首先引入对应命名空间:using System.Diagnostics.CodeAnalysis;
修改接口定义如下:
public interface IAuditEntity<TKey> { [MaybeNull] TKey UpdatedBy { get; set; } }
该方案无需添加泛型约束,即可同时支持值类型和引用类型作为TKey参数,满足int和string两种主键的使用需求。
内容的提问来源于stack exchange,提问作者Sun
相关产品推荐
相关产品推荐

