0

次のようなリストを持つクラスがあるとします。

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

foreach を有効にして、Items リストを参照せずに foreach を実行できるようにする方法があります。

foreach(Accounts の Account account) ?

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 に答える