.NET 6中如何指定泛型类型参数以支持相等运算符==的使用?
问题根因
- 第一点:
IEqualityOperators<TSelf, TOther, TResult>是.NET 7 才正式引入的BCL接口,.NET 6 原生不支持该接口约束,即便手动引入第三方兼容包,.NET 6的泛型静态成员解析能力也不足以支撑直接在泛型上下文调用==运算符。 - 第二点:你当前的代码本身存在两个语法问题:
Where()返回的是IEnumerable<TModel>集合,不能直接赋值给单个TModel类型的返回值,需要追加FirstOrDefault()/Single()等方法取单个实体- 即便是.NET 7+环境使用
IEqualityOperators,也需要补全第三个泛型参数指定返回值为bool,否则编译器找不到匹配的==运算符重载
解决方案
方案1:.NET 6 兼容实现(推荐)
不需要依赖高版本的运算符接口,直接使用.NET 全版本支持的默认相等比较器做比对,性能稳定,适配所有实现了IEquatable<TKey>的类型和内置基元类型:
public interface IStore<TModel, TKey> where TModel : IEntity<TKey> { public IEnumerable<TModel> GetAll(); // 接口默认实现 TModel GetById(TKey id) => GetAll().FirstOrDefault(x => EqualityComparer<TKey>.Default.Equals(x.Id, id)); }
该写法不需要额外增加TKey的约束,即可实现相等比对逻辑,完全适配.NET 6环境。
方案2:.NET 7+ 运算符写法
如果一定要使用==运算符的写法,先将项目框架升级到.NET 7及以上版本,修正接口约束和代码语法即可:
// 补全IEqualityOperators的第三个泛型参数,指定比较返回值为bool public interface IStore<TModel, TKey> where TModel: IEntity<TKey> where TKey : IEqualityOperators<TKey, TKey, bool> { public IEnumerable<TModel> GetAll(); // 修正返回值语法,增加FirstOrDefault取单个结果 TModel GetById(TKey id) => GetAll().FirstOrDefault(x => x.Id == id); }
内容的提问来源于stack exchange,提问作者Mátyás Székely
相关产品推荐
相关产品推荐

