0

假设我有一堂课,列表如下:

static class Accounts
{
   public static List<Account> Items;
   ...
}

我有一种方法可以启用 foreach,这样我就可以在不引用 Items 列表的情况下执行 foreach,例如:

foreach(Accounts 中的账户) ?

4

2 回答 2

2

不可以。根据 C# 5.0 规范的第 10.1.1.3 节,静态类不能实现接口。

静态类声明受以下限制:

...

  • 静态类可能不包括基于类的规范(第 10.1.4 节),并且不能显式指定基类或已实现接口的列表。静态类隐式继承自类型对象。

...

因此,没有办法实现IEnumerable,这就是foreach工作原理。

我探索了利用foreach将查找成员查找或未GetEnumerator找到接口这一事实的选项,但这也不起作用,因为不幸的是,期望的expr参数foreach不支持类型名称。

最好的选择是让它不是静态的,而是遵循单例模式。也就是说,有一个静态属性是类的唯一允许的实例。但这并不能消除读取属性的需要,因此无论如何它不会真正为您提供任何东西。

如果您只是想掩盖实现(良好的调用),您可以创建 type 的属性IEnumerable<Account>,然后将其设置为等于(无论您在哪里执行此操作)为 new List<Account>。然后,按照合同,您不允许其他类修改列表,并且您没有将它们耦合到实现。无论如何,这些都是实现IEnumerable这样的东西的主要优点。所以这应该足够了。

于 2015-03-07T20:46:47.497 回答
0

为什么不直接使用列表?

foreach (Account account in Accounts.Items)

如果你想实现这个,你需要继承IEnumerable接口并实现它的行为。

在我看来,这样做会比直接使用列表更令人困惑。

于 2015-03-07T20:45:57.710 回答