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

List<Transaction>无法调用List<Event>的PassDays扩展方法报CS1929错误

CS1929报错原因

C#中的List<T>属于**不变(invariant)**的泛型类型,不支持协变特性。尽管Transaction是Event的派生类,但List<Transaction>和List<Event>之间不存在继承关系,因此无法直接将List<Transaction>类型的实例作为List<Event>类型的参数传入扩展方法。

解决方案

以下三个方案可根据你的实际场景选择:

  • 方案1:修改扩展方法参数为支持协变的接口(最推荐)
    IEnumerable<out T>是C#内置支持协变的泛型接口,将扩展方法的第一个参数类型替换为IEnumerable<Event>即可:
    public static IEnumerable<Day> PassDays(this IEnumerable<Event> events, int daysToPass, DateTime startTime)
    
    该方案无需修改原有调用代码,同时扩展方法可兼容所有实现IEnumerable<Event>的集合类型,适用范围更广,也没有额外性能开销。
  • 方案2:调用时转换集合类型
    若你不想修改现有扩展方法的定义,可在调用时将List<Transaction>显式转换为List<Event>:
    var days = account.Transactions.Cast<Event>().ToList().PassDays(10, Today);
    // 或简化写法
    var days = account.Transactions.ToList<Event>().PassDays(10, Today);
    
    该方案会生成新的List<Event>实例,存在轻微性能开销,适合仅临时调用的场景。
  • 方案3:将扩展方法改造为泛型方法
    若你需要保留扩展方法仅接收List类型的约束,可将其改为泛型实现:
    public static IEnumerable<Day> PassDays<T>(this List<T> events, int daysToPass, DateTime startTime) where T : Event
    
    该方案也无需修改原有调用代码,同时不会产生额外的集合转换开销。

内容的提问来源于stack exchange,提问作者Henry Puspurs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:39:02