Ienumerableインターフェイスを使用せずにgetEnumerator()を使用できますか?

StackOverflow https://stackoverflow.com/questions/2905737

  •  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(), CurrentMoveNext(). 。これは主に、ジェネリックの前にC#1で強力な(および非ボクシング)反復を可能にすることでした。詳細については、C#3仕様のセクション8.8.4を参照してください。

しかし、あなたが今これをするのは一般的に悪い考えです 行う インスタンスの内容をコレクションとして簡単に反復できるようにしたい - 実際、実装を提案することをお勧めします IEnumerable<T> ただの代わりに IEnumerable.

他のヒント

はい、できます。で使用することもできます foreach. 。このクラスのオブジェクトがキャストできない唯一の問題 IEnumerable 彼らは必要な方法を実装していますが。

実装しなければならない理由はありません IEnumerable 呼ばれる関数を作成するため GetEnumerator それはに戻ります IEnumerator, 、それは、あなたがそのタイプのインスタンスを、 IEnumerable.

インターフェイスにより、契約が保証されます。これは、インターフェイスを暗示していないクラスのインターフェイスの署名と同じ署名を持つメソッドを持たないという意味ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top