【问题标题】:IEnumerable Interface Causing An Error with ListIEnumerable 接口导致列表错误
【发布时间】:2013-11-26 02:51:06
【问题描述】:

我应该调整我的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;
        }
    }

【问题讨论】:

  • 1.什么例外 2. 什么是frmNewItem
  • frmNewItem 是什么?
  • 使用类的表单。我有一个 InvItem 类、一个 InvItemList 类和一个 New Item 表单。

标签: c# list ienumerable


【解决方案1】:

IEnumerable 的命名空间是System.Collections,而IEnumerable&lt;T&gt; 的命名空间是System.Collections.Generic

确保您引用的是正确的。

【讨论】:

  • @MarcinJuraszek 感谢您添加转义字符。
  • 嗯,我也是这么想的;我是否使用不正确,您可以看到?使用系统;使用 System.Collections;使用 System.Linq;使用 System.Text;使用 System.Threading.Tasks;命名空间 InventoryMaintenance { 公共类 InvItemList : IEnumerable { 私有 List invItems;公共 InvItemList() { invItems = new List();
  • 如果你想使用List&lt;T&gt;,你也必须添加命名空间引用System.Collection.Generic。所以正确的参考顺序可能是:using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
  • 或者你可以这样定义InvItemList:public class InvItemList : System.Collections.IEnumerable,那么永远不会有任何错误引用。
  • 啊哈,如果我同时输入 System.Collections 和 System.Collections.Generic,然后定义我在类中使用的 IEnumerable,就可以解决错误!非常感谢!
【解决方案2】:
  1. 您必须导入 System.Collection 才能摆脱 namespace could not be found 错误。

  2. 您可能应该考虑使用通用IEnumerable&lt;T&gt; 接口而不是非通用IEnumerable

在此处修复您的代码以使其编译:

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

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

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

我用List&lt;T&gt;.GetEnumerator() 方法代替了foreach 循环,因为它看起来更干净。

要实现泛型IEnumerable&lt;T&gt; 更改类声明并添加一个附加方法:

public class InvItemList : IEnumerable<InvItem>, IEnumerable
{

    // (...)

    IEnumerator<InvItem> IEnumerable<InvItem>.GetEnumerator()
    {
        return invItems.GetEnumerator();
    }
}

【讨论】:

    【解决方案3】:

    您需要更正一些错误:

    添加:

    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;
            }
        }
    }
    

    【讨论】:

    • 使用您的 foreach,我收到“检测到无法访问的代码”错误。我的 InvItem 类是公开的;研究它,该错误似乎是指循环中断不正确。但怎么可能呢?
    • 在哪一行显示错误?如果您逐字复制上述代码,我怀疑不在 foreach 中。尽管现在的课程不是很有用。您正在创建一个空列表实例作为私有成员字段,并且没有向其中添加任何项目的代码。
    【解决方案4】:

    如果我同时使用 System.Collections 和 System.Collections.Generic,然后在声明类时使用

    public class InvItemList : System.Collections.IEnumerable
    

    错误解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多