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

关于IEnumerable接口显式实现方法IEnumerator IEnumerable.GetEnumerator()的疑问

关于IEnumerable接口显式实现方法IEnumerator IEnumerable.GetEnumerator()的疑问

嘿,这个问题问得太到位了!这绝对不是拼写错误,而是C#里很实用的显式接口实现语法,我来给你拆解清楚:

首先你得知道一个关键点:IEnumerable<T>(泛型枚举接口)是直接继承自非泛型的IEnumerable接口的。这意味着当你的类实现IEnumerable<Product?>时,实际上同时需要履行两个接口的义务——既要实现泛版的GetEnumerator(),也要实现非泛版的GetEnumerator()。

你代码里的第二个方法:

public IEnumerator<Product?> GetEnumerator() => Products?.GetEnumerator() ?? Enumerable.Empty<Product?>().GetEnumerator();

是在实现泛型接口IEnumerable<Product?>要求的GetEnumerator()方法,这个方法是公共的,通过ShoppingCart实例就能直接调用。

而第三个方法:

IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

是显式实现了非泛型IEnumerable接口的GetEnumerator()方法。这么做有两个核心原因:

  • 保持类的公共接口整洁:显式实现的接口方法,不能通过类的直接实例调用,必须把实例转换成对应接口类型(比如IEnumerable cart = new ShoppingCart();)才能访问。这样外部使用ShoppingCart时,只会看到更实用的泛型版本方法,不会被非泛版的方法干扰。
  • 复用已有逻辑:这里直接调用了泛版的GetEnumerator(),不用重复写空值判断那堆逻辑,代码更简洁也更易维护。

你可能会疑惑“为什么不直接把非泛版方法也写成公共的?”,其实完全可以,但显式实现是更规范的做法——因为对于泛型集合来说,泛版的枚举器类型更安全(不用强制类型转换),所以我们更希望用户优先使用泛版方法,非泛版只是为了兼容那些只认识非泛型IEnumerable的旧代码或API。

总结一下:这三个成员各司其职,没有多余的,是标准的泛型枚举类实现方式哦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:27:58