You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6中如何指定泛型类型参数以支持相等运算符==的使用?

问题根因

  • 第一点:IEqualityOperators<TSelf, TOther, TResult> 是.NET 7 才正式引入的BCL接口,.NET 6 原生不支持该接口约束,即便手动引入第三方兼容包,.NET 6的泛型静态成员解析能力也不足以支撑直接在泛型上下文调用==运算符。
  • 第二点:你当前的代码本身存在两个语法问题:
    1. Where()返回的是IEnumerable<TModel>集合,不能直接赋值给单个TModel类型的返回值,需要追加FirstOrDefault()/Single()等方法取单个实体
    2. 即便是.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:45:02