C# Foreach 语句不包含 GetEnumerator 的公共定义
Posted
技术标签:
【中文标题】C# Foreach 语句不包含 GetEnumerator 的公共定义【英文标题】:C# Foreach statement does not contain public definition for GetEnumerator 【发布时间】:2013-02-16 00:42:59 【问题描述】:我在使用 C# 构建的 Windows 窗体应用程序时遇到问题。错误说明“foreach 语句无法对 'CarBootSale.CarBootSaleList' 类型的变量进行操作,因为 'CarBootSale.CarBootSaleList' 不包含 'GetEnumerator' 的公共定义”。
我似乎无法理解是什么原因造成的。
这是引发错误的代码:
List<CarBootSaleList> Sortcarboot = new List<CarBootSaleList>();
foreach (CarBootSale c in carBootSaleList)
if (c.Charity == "N/A")
Sortcarboot.Add(carBootSaleList);
textReportGenerator.GenerateAllReport(Sortcarboot, AppData.CHARITY);
这是 CarBootSaleList 类,它表示没有 GetEnumerator 定义:
public class CarBootSaleList
private List<CarBootSale> carbootsales;
public CarBootSaleList()
carbootsales = new List<CarBootSale>();
public bool AddCarBootSale(CarBootSale carbootsale)
bool success = true;
foreach (CarBootSale cbs in carbootsales)
if (cbs.ID == carbootsale.ID)
success = false;
if (success)
carbootsales.Add(carbootsale);
return success;
public void DeleteCarBootSale(CarBootSale carbootsale)
carbootsales.Remove(carbootsale);
public int GetListSize()
return carbootsales.Count();
public List<CarBootSale> ReturnList()
return carbootsales;
public string Display()
string msg = "";
foreach (CarBootSale cbs in carbootsales)
msg += String.Format("0 1", cbs.ID, cbs.Location, cbs.Date);
msg += Environment.NewLine;
return msg;
【问题讨论】:
foreach(Sortcarboot 中的 CarBootSaleList c) 你可以在这里找到答案(foreach 的实现):***.com/questions/10929586/… 这两行有关系吗? ListcarBootSaleList
变量声明在哪里?
@Marcus 在类的顶部“CarBootSaleList carBootSaleList = new CarBootSaleList();”
【参考方案1】:
您应该实现 IEnumerable 接口(CarBootSaleList 应该在您的情况下实现它)。
http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.getenumerator.aspx
但是继承 System.Collections.ObjectModel.Collection 和朋友通常更容易
http://msdn.microsoft.com/en-us/library/system.collections.objectmodel.aspx
您的代码似乎也有点奇怪,就像您在嵌套列表一样?
【讨论】:
【参考方案2】:您的CarBootSaleList
课程不是列表。它是一个包含列表的类。
您有三个选择:
让你的CarBootSaleList
对象实现IEnumerable
或
让您的 CarBootSaleList 继承自 List<CarBootSale>
或
如果你很懒,这几乎可以在没有额外编码的情况下做同样的事情
List<List<CarBootSale>>
【讨论】:
你真的只是建议作者使用包含List
的CarBootSales
的List
吗?只有前两个选项真正有意义。【参考方案3】:
您没有向我们展示carBootSaleList
的声明。但是从异常消息中我可以看到它的类型为CarBootSaleList
。此类型没有实现IEnumerable
接口,因此不能在foreach 中使用。
你的CarBootSaleList
类应该实现IEnumerable<CarBootSale>
:
public class CarBootSaleList : IEnumerable<CarBootSale>
private List<CarBootSale> carbootsales;
...
public IEnumerator<CarBootSale> GetEnumerator()
return carbootsales.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator()
return carbootsales.GetEnumerator();
【讨论】:
【参考方案4】:在foreach
循环而不是carBootSaleList
中使用carBootSaleList.data
。
您可能不再需要回答,但它可以帮助某人。
【讨论】:
以上是关于C# Foreach 语句不包含 GetEnumerator 的公共定义的主要内容,如果未能解决你的问题,请参考以下文章