Ienumerableインターフェイスを使用せずにgetEnumerator()を使用できますか?
-
04-10-2019 - |
質問
私はPrimesと呼ばれるクラスを持っています。このクラスは、Ienumerableインターフェイスを実装せずにgetEnumerator()を実装しています。
public class Primes
{
private long min;
private long max;
public Primes()
: this(2, 100)
{
}
public IEnumerator GetEnumerator()
{...}
理解できません。私は何かが足りませんか?
解決
まず、他の人が言ったように、とにかくインターフェイスを実装せずに独自の方法を紹介できる - あなたはあなた自身のものを書くことができます Dispose
実装せずにメソッド IDisposable
よく知られているインターフェイスの場合、これはほとんど悪い考えであることをお勧めします(読者は一定の期待を持っているので)が、完全に有効です。
さらに重要なことは、 foreach
C#の声明 できる なしで働く IEnumerable
関与する。コンパイラは、名前に効果的にタイムダックタイピングをコンパイルします GetEnumerator()
, Current
と MoveNext()
. 。これは主に、ジェネリックの前にC#1で強力な(および非ボクシング)反復を可能にすることでした。詳細については、C#3仕様のセクション8.8.4を参照してください。
しかし、あなたが今これをするのは一般的に悪い考えです 行う インスタンスの内容をコレクションとして簡単に反復できるようにしたい - 実際、実装を提案することをお勧めします IEnumerable<T>
ただの代わりに IEnumerable
.
他のヒント
はい、できます。で使用することもできます foreach
. 。このクラスのオブジェクトがキャストできない唯一の問題 IEnumerable
彼らは必要な方法を実装していますが。
実装しなければならない理由はありません IEnumerable
呼ばれる関数を作成するため GetEnumerator
それはに戻ります IEnumerator
, 、それは、あなたがそのタイプのインスタンスを、 IEnumerable
.
インターフェイスにより、契約が保証されます。これは、インターフェイスを暗示していないクラスのインターフェイスの署名と同じ署名を持つメソッドを持たないという意味ではありません。