Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不了解IEnumerable<;T>;_C#_.net_Ienumerable - Fatal编程技术网

C# 不了解IEnumerable<;T>;

C# 不了解IEnumerable<;T>;,c#,.net,ienumerable,C#,.net,Ienumerable,我的代码有很多问题。编译时,出现以下错误: “Ecommerce.DataHelpers.ProductNodeLoader”未实现接口成员“System.Collections.IEnumerable.GetEnumerator()”电子商务.DataHelpers.ProductNodeLoader.GetEnumerator()无法实现“System.Collections.IEnumerable.GetEnumerator()”,因为它没有匹配的返回类型“System.Collecti

我的代码有很多问题。编译时,出现以下错误:


“Ecommerce.DataHelpers.ProductNodeLoader”未实现接口成员“System.Collections.IEnumerable.GetEnumerator()”电子商务.DataHelpers.ProductNodeLoader.GetEnumerator()无法实现“System.Collections.IEnumerable.GetEnumerator()”,因为它没有匹配的返回类型“System.Collections.IEnumerator”


我不知道如何解决这个问题,所以现在我必须问你们

代码:

namespace Ecommerce.DataHelpers
{
公共类ProductNodeLoader:IEnumerable
{
私有ISqlHelper-sqlHelper;
私有IRecordsReader节点阅读器;
公共列表=新列表();
//加载给定公司的所有产品
公共IEnumerator GetEnumerator()
{
int companyId=2;
尝试
{
sqlHelper=DataLayerHelper.CreateSqlHelper(GlobalSettings.DbDSN);
nodeReader=sqlHelper.ExecuteReader(@)
从电子商务节点中选择*,其中companyId=@companyId)
,sqlHelper.CreateParameter(“@companyId”,companyId));
}
捕获(例外e)
{
添加(LogTypes.Custom,-1,e.InnerException.ToString());
屈服断裂;
}
if(nodeReader.HasRecords)
{
while(nodeReader.Read())
{
ProductNode=新的ProductNode();
node.id=nodeReader.Get(“id”);
node.parentId=nodeReader.Get(“parentId”);
node.companyId=noderReader.Get(“companyId”);
node.path=nodeReader.Get(“路径”);
node.sortOrder=nodeReader.Get(“sortOrder”);
node.text=nodeReader.Get(“text”);
node.nodeType=nodeReader.Get(“nodeType”);
列表。添加(节点);
}
nodeReader.Close();
}
其他的
{
抛出新的ApplicationException(“没有要加载的产品”);
}
退货清单;
}
}
}


我为糟糕的编辑道歉

您也在尝试实现非泛型的
IEnumerable
类型,因为
IEnumerable
扩展了它。幸运的是,这很容易:

// Along with the existing using directives
using System.Collections;
...

// In the implementing class
IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}
请注意,您必须至少使用两个需要实现的
GetEnumerator()
方法中的一个,因为它们具有相同的签名(相同的名称,没有参数),但返回类型不同。幸运的是,泛型版本的返回值可以用于非泛型版本,这就是通常使用上述模式的原因

编辑:正如Josh在评论中正确指出的,您还有其他问题:

  • 你不应该有一个
    返回列表在代码末尾,除非删除
    屈服中断
    更早(并将其更改为
    return list.GetEnumerator();
    )。如果希望将代码保持为迭代器块,则应使用
    yield return
    生成所创建的每个节点
  • 您应该生成
    T
    的实例,而您正在构建
    ProductNode
    的实例。也许您实际上应该实现
    IEnumerable
    ,而不是
    IEnumerable
    ,并使您的类成为非泛型类
  • 只要调用方决定对SQL连接进行迭代,您的代码就会保持SQL连接处于打开状态。这可能是个问题,也可能不是,但值得记住
  • 您应该使用
    using
    语句来确保您的
    nodeReader
    在出错时被释放(当然,假设调用方释放了
    IEnumerator
  • 您的公共
    列表
    字段是个坏主意。。。为什么要把它作为一个实例变量呢

您也在尝试实现非泛型的
IEnumerable
类型,因为
IEnumerable
扩展了它。幸运的是,这很容易:

// Along with the existing using directives
using System.Collections;
...

// In the implementing class
IEnumerator IEnumerable.GetEnumerator()
{
    return GetEnumerator();
}
请注意,您必须至少使用两个需要实现的
GetEnumerator()
方法中的一个,因为它们具有相同的签名(相同的名称,没有参数),但返回类型不同。幸运的是,泛型版本的返回值可以用于非泛型版本,这就是通常使用上述模式的原因

编辑:正如Josh在评论中正确指出的,您还有其他问题:

  • 你不应该有一个
    返回列表在代码末尾,除非删除
    屈服中断
    更早(并将其更改为
    return list.GetEnumerator();
    )。如果希望将代码保持为迭代器块,则应使用
    yield return
    生成所创建的每个节点
  • 您应该生成
    T
    的实例,而您正在构建
    ProductNode
    的实例。也许您实际上应该实现
    IEnumerable
    ,而不是
    IEnumerable
    ,并使您的类成为非泛型类
  • 只要调用方决定对SQL连接进行迭代,您的代码就会保持SQL连接处于打开状态。这可能是个问题,也可能不是,但值得记住
  • 您应该使用
    using
    语句来确保您的
    nodeReader
    在出错时被释放(当然,假设调用方释放了
    IEnumerator
  • 您的公共
    列表
    字段是个坏主意。。。为什么要把它作为一个实例变量呢

我不敢在这里竞争,但值得注意的是,这不是他的唯一问题。方法中有一个不允许的return语句,他返回的是ProductNode的一个具体实例,其中需要泛型类型T。一般来说,他应该做的是收益率回报,而不是addin