Необработанное исключение. System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь распечатать содержимое стека.

Класс стека

При попытке получить следующую ошибку.

Необработанное исключение. System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

Что происходит в строке foreach моего кода. Я не уверен, почему это происходит, так как я думал, что использовал пример, приведенный на странице, на которую я ссылался. Примером будет ...

        foreach( string number in numbers )
        {
            Console.WriteLine(number);
        }

Ниже приведен мой код. Все кажется работоспособным, кроме этой части, которая выдает ошибку.

            foreach(var s in stack)
            {
                Console.WriteLine(s);
            }

... и это мой код.

using System;

namespace Exercise
{
    class Program
    {
        static void Main()
        {
            var stack = new Stack();
            stack.Push(1);
            stack.Push(2);
            stack.Push(3);

            foreach(var s in stack)
            {
                Console.WriteLine(s);
            }
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace Exercise
{
    internal class Stack : IEnumerable
    {
        private object _object;
        private List<object> list = new List<object>();
        private IEnumerator Enumerator;
        public IEnumerator GetEnumerator() => Enumerator;

        internal object Pop()
        {
            if (list.Count == 0)
                throw new InvalidOperationException("Cannot use .Pop() if list count equals 0.");

            _object = list.FirstOrDefault();

            list.RemoveAt(0);

            return _object;
        }

        internal void Push(object obj)
        {
            _object = obj;

            if (_object == null)
                throw new InvalidOperationException("Cannot use .Push() if object is null.");

            list.Insert(0, _object);
        }

        internal void Clear()
        {
            if (list.Count == 0)
                throw new InvalidOperationException("Cannot use .Clear() if list is empty.");

            list.Clear();
        }
    }
}

Что я делаю неправильно и как я могу исправить это, чтобы напечатать содержимое стека?

1 Ответ

2 голосов
/ 31 марта 2020

Ваш метод GetEnumerator возвращает значение NULL, поскольку поле Enumerator никогда не инициализировалось явным образом, поэтому он получил значение по умолчанию NULL.

Затем foreach l oop вызывает .GetEnumerator(), получает null и пытается получить доступ к свойству .Current null, поэтому вы получаете NullReferenceExcpetion.

. Чтобы исправить это, вы можете использовать следующую реализацию:

public IEnumerator GetEnumerator()
{
    while (list.Any())
        yield return Pop();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...