gpt4 book ai didi

c# - 无法识别 List 的扩展方法

转载 作者:行者123 更新时间:2023-11-30 14:29:36 25 4
gpt4 key购买 nike

我正在为我们的一些 BusinessObjects 编写几个扩展方法

例如:

public static IBusinessObject GetBusinessObjectById<T>(this IBusinessObject businessObject, int id)

现在如果我创建一个类:

public class Topic : IBusinessObject

然后我可以调用我的分机:

topic.GetBusinessObjectById<Topic>(id);

然而那是工作的东西,现在我试着写一个专注于 List<IBusinessObject> 的扩展:

public static List<T> GetItems<T>(this List<IBusinessObject> list)

然后创建一个新列表:

List<Topic> topics = new List<Topic>();

topics.GetItems<Topic>();给出错误

List<Topic> does not contain a definition for GetItems

我如何编写一个扩展方法,它专注于实现了我的接口(interface)的类的 List 实例?

最佳答案

A List<Topic> 不是 List<IBusinessObject> , 即使 Topic工具 IBusinessObject ;那是因为List<T>不是 covariant (无论如何,只有接口(interface)和委托(delegate)可以是协变的,类不能)。

如果是,它可能会导致各种问题;例如,考虑这个(假设的)扩展方法:

public static void Foo(this List<IBusinessObject> list)
{
list.Add(new FooBusinessObject());
}

如果您可以在 List<BarBusinessObject> 上调用此方法,它会添加一个错误类型的对象,这会在运行时导致异常。

如果您的 GetItems方法不会修改列表,它应该接受这些接口(interface)之一而不是 List<IBusinessObject> :

  • IEnumerable<IBusinessObject>
  • IReadOnlyCollection<IBusinessObject>
  • IReadOnlyList<IBusinessObject>

所有这些接口(interface)都是协变的。

关于c# - 无法识别 List<InterfaceType> 的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25639232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com