Domanda

Ok, iniziamo con questo semplice pulsante click Method

    private void button1_Click(object sender, EventArgs e)
    {
        int counter = 1;
        List<int> items = new int[] { 1, 2, 3 }.ToList();
        List<int>.Enumerator enm = items.GetEnumerator();

        // 1
        if (!enm.MoveNext())
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter)
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        // 2
        if (!enm.MoveNext()) 
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter) 
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        //3
        if (!enm.MoveNext())
            throw new Exception("Unexpected end of list");
        if (enm.Current != counter)
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, enm.Current));
        counter++;

        if (enm.MoveNext()) 
            throw new Exception("Unexpected continuation of list");
    }
.

Questo metodo non fa nulla perché ogni asserzione passa con grazia.Le cose vanno bene finché non credo che dovrei introdurre un metodo per rimuovere la ridondanza

    static void AssertNext(ref int counter, List<int>.Enumerator e)
    {
        if (!e.MoveNext()) 
            throw new Exception("Unexpected end of list");
        if (e.Current != counter) 
            throw new Exception(String.Format("Expect {0} but actual {1}", counter, e.Current));
        counter++;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        var counter = 1;
        var items = new int[] { 1, 2, 3 }.ToList();
        var enm = items.GetEnumerator();
        AssertNext(ref counter, enm);
        AssertNext(ref counter, enm);
        AssertNext(ref counter, enm);
        if (enm.MoveNext()) throw new Exception("Unexpected continuation of list");
    }
.

Anche se, questo refactoring è semplice (per me, almeno).Spezza il programma! Sulla seconda chiamata ad assertnext, sembra che l'enumeratore sia già stato ripristinato al punto di partenza e causare il fallimento dell'assertion.

Non riesco a capire cosa succede.Mi sento davvero come un principiante con questo puzzle.

Cosa mi manca qui?

È stato utile?

Soluzione

Sto immaginando che ha qualcosa a che fare con la lista.Enumeratore è una struttura.Lo stai passando in un metodo, manipolandolo, e poi tornando.La manipolazione probabilmente non sarà successa per la tua istanza originale.

Altri suggerimenti

List<T>.Enumerator è un tipo di valore che significa che è copiato nell'ambito locale del tuo metodo, alterato e quindi distrutto dopo aver lasciato il metodo.Prova a passarlo anche con riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top