Интерфейс IEnumerable, вызывающий ошибку со списком

Я должен настроить свой класс InvItems для использования интерфейса IEnumerable, но не использовать интерфейс IEnumerable<>. Однако, когда я настраиваю класс, мой List<InvItem> выскакивает с ошибками, и я не понимаю, почему.

Ошибка:

"не удалось найти тип или пространство имен".

Я думаю, что мне нужно преобразовать список, но я не совсем уверен, как это сделать (я нашел только инструкции по использованию интерфейса IEnumerable <>). Спасибо за любую помощь!

public class InvItemList : IEnumerable
{
    private List<InvItem> invItems;

    public InvItemList()
    {
        invItems = new List<InvItem>();
    }

    public IEnumerator GetEnumerator()
    {
        foreach (InvItem in invItems)
        {
            yield return frmNewItem;
        }
    }

person Michelle Farley    schedule 26.11.2013    source источник
comment
1. Какое исключение 2. Что такое frmNewItem?   -  person zerkms    schedule 26.11.2013
comment
что такое frmNewItem ?   -  person Noctis    schedule 26.11.2013
comment
Форма, использующая классы. У меня есть класс InvItem, класс InvItemList и форма New Item.   -  person Michelle Farley    schedule 26.11.2013


Ответы (4)


Пространство имен для IEnumerableSystem.Collections, а для IEnumerable<T>System.Collections.Generic.

Убедитесь, что вы ссылаетесь на правильный.

person Rebornix    schedule 26.11.2013
comment
@MarcinJuraszek Спасибо за добавление escape-символов. - person Rebornix; 26.11.2013
comment
Хм, я тоже так думал; я использую его неправильно, что вы можете видеть? с помощью системы; использование System.Collections; с помощью System.Linq; используя System.Text; использование System.Threading.Tasks; пространство имен InventoryMaintenance { открытый класс InvItemList: IEnumerable { частный список‹InvItem› invItems; public InvItemList() { invItems = новый список‹InvItem›(); - person Michelle Farley; 26.11.2013
comment
Поскольку вы хотите использовать List<T>, вы также должны добавить ссылку на пространство имен System.Collection.Generic. Таким образом, правильный порядок ссылок может быть: using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; - person Rebornix; 26.11.2013
comment
Или вы можете определить InvItemList следующим образом: public class InvItemList : System.Collections.IEnumerable тогда никогда не будет неправильной ссылки. - person Rebornix; 26.11.2013
comment
Ага, если я добавлю и System.Collections, и System.Collections.Generic, а затем определю, какой IEnumerable я использую с классом, это решит ошибки! Спасибо большое! - person Michelle Farley; 26.11.2013
comment
добро пожаловать~ Вы можете попробовать использовать Resharper или StyleCop. Они могут дать больше подсказок, если вы кодируете неправильно. - person Rebornix; 26.11.2013

  1. Вы должны импортировать System.Collection, чтобы избавиться от ошибки пространство имен не найдено.

  2. Вероятно, вам следует подумать об использовании универсального интерфейса IEnumerable<T> вместо неуниверсального IEnumerable.

Вот исправление вашего кода, чтобы он скомпилировался:

public class InvItemList : IEnumerable
{
    private List<InvItem> invItems;

    public InvItemList()
    {
        invItems = new List<InvItem>();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return invItems.GetEnumerator();
    }
}

Я использовал метод List<T>.GetEnumerator() вместо цикла od foreach, потому что он выглядит чище.

Чтобы реализовать универсальное объявление класса IEnumerable<T>, измените объявление класса и добавьте один дополнительный метод:

public class InvItemList : IEnumerable<InvItem>, IEnumerable
{

    // (...)

    IEnumerator<InvItem> IEnumerable<InvItem>.GetEnumerator()
    {
        return invItems.GetEnumerator();
    }
}
person MarcinJuraszek    schedule 26.11.2013

Вам нужно будет исправить несколько ошибок:

Добавлять:

using System.Collections;

Исправьте оператор foreach:

foreach (InvItem frmNewItem in invItems)

Итак, вместе это выглядит так:

using System.Collections;

public class InvItem
{
}

public class InvItemList : IEnumerable
{
    private List<InvItem> invItems;

    public InvItemList()
    {
        invItems = new List<InvItem>();
    }

    public IEnumerator GetEnumerator()
    {
        foreach (InvItem frmNewItem in invItems)
        {
            yield return frmNewItem;
        }
    }
}
person Alex    schedule 26.11.2013
comment
Используя ваш foreach, я получаю сообщение об ошибке «Обнаружен недостижимый код». Мой класс InvItem общедоступен; исследуя его, ошибка, кажется, неправильно относится к разрыву цикла. но как это может быть? - person Michelle Farley; 26.11.2013
comment
В какой строке показывает ошибку? Я подозреваю, что не в foreach, если вы дословно скопировали приведенный выше код. Хотя класс в том виде, в каком он есть сейчас, не очень полезен. Вы создаете пустой экземпляр списка как личное поле участника, и нет кода, добавляющего в него какие-либо элементы. - person Alex; 26.11.2013

Если я использую как System.Collections, так и System.Collections.Generic, а затем при объявлении класса с помощью

public class InvItemList : System.Collections.IEnumerable

ошибки решают.

person Michelle Farley    schedule 26.11.2013