无法从派生类型列表访问扩展方法

Posted

技术标签:

【中文标题】无法从派生类型列表访问扩展方法【英文标题】:Extension method not accessible from list of derived type 【发布时间】:2021-11-19 02:51:49 【问题描述】:

我正在为自己做一个小练习项目,我正在尝试在我的测试中调用这个扩展方法

var days = account.Transactions.PassDays(10, Today);

这给了我这个错误

CS1929    'List<Transaction>' does not contain a definition for 'PassDays' and the best extension method overload 'PassTime.PassDays(List<Event>, int, DateTime)' requires a receiver of type 'List<Event>'

using语句高亮,扩展方法声明为

public static IEnumerable<Day> PassDays(this List<Event> events, int daysToPass, DateTime startTime)

我尝试使用它的 List 是一个派生自 Event 类的类。我读过的所有内容都表明这应该可行。

public record Transaction : Event
public record Event : IEvent

【问题讨论】:

List&lt;Transaction&gt; 不是List&lt;Event&gt; (并且不是派生自)所以你期望什么?如果你想使用协方差,那么你需要使用像IEnumerable这样的接口 这是因为Transaction 继承了EventList&lt;Transaction&gt; 没有继承List&lt;Event&gt;?如果不将其作为特定于List&lt;Transaction&gt; 的扩展,您的建议是什么,因为我计划对继承Event 的其他类使用相同的方法。刚看到你的编辑,我会试试的。 【参考方案1】:

使用

public static IEnumerable<Day> PassDays(this IEnumerable<IEvent> events, int daysToPass, DateTime startTime)

解决了这个问题。 (IEvent 对此没有必要,但我进行了更改以期望它更有用)也许其他人可以解释为什么这样做。

【讨论】:

为什么会这样 - 这是一个很长的阅读,但相关位在最后; docs.microsoft.com/en-us/dotnet/standard/generics/…

以上是关于无法从派生类型列表访问扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

C# this扩展方法

Java 缺失的特性:扩展方法

学习系列之扩展方法

通用扩展方法:无法从用法推断类型参数

从LINQ开始之LINQ to Objects(下)

无法从使用 SWIG 创建的 python 访问 C++ 扩展模块及其方法