C# 在进行foreach时出现不包含MoveNext的定义

wlm1314520 2012-06-08 11:21:35
已经定义啦!using System.Collections;
primes pF = new primes(2, 1100);
foreach (long i in pF)
Console.Write("{0}", i);
在foreach出现时出现不包含MoveNext的定义。
错误 1 foreach 要求“ch1103.primes.GetEnumerator()”的返回类型“System.Collections.IEnumerable”必须具有适当的公共 MoveNext 方法和公共 Current 属性 D:\Documents\Visual Studio 2010\Projects\C#\ch1101\ch1103\Program.cs 68
...全文
466 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_25718155 2015-02-16
  • 打赏
  • 举报
回复
事实上是IEnumerator接口的MoveNext()方法;楼主打错了,打成了IEnumerable接口,所以出现了错误。
hhddzz 2013-02-15
  • 打赏
  • 举报
回复
而且这些函数即使是扩展函数也行
hhddzz 2013-02-15
  • 打赏
  • 举报
回复
3#正解,这种现象在.NET中比较普遍 比如集合初始化器也是使用任意可访问的公共Add函数,并不需要是IList.Add await也是可以用于任何实现了所需成员的类型上,这些成员不属于某个接口 还有编译器对foreach有优化,并不一定会使用MoveNext和Current来实现
宝_爸 2013-02-15
  • 打赏
  • 举报
回复
有点tricky: 一下来自msdn: 在 C# 中,集合类并非必须严格从 IEnumerable 和 IEnumerator 继承才能与 foreach 兼容;只要类有所需的 GetEnumerator、MoveNext、Reset 和 Current 成员,便可以与 foreach 一起使用。省略接口的好处为,使您可以将 Current 的返回类型定义得比 object 更明确,从而提供了类型安全。 详细信息请阅读: 如何:使用 foreach 访问集合类(C# 编程指南) http://msdn.microsoft.com/zh-cn/library/9yb8xew9(v=vs.80).aspx
stonespace 2013-02-15
  • 打赏
  • 举报
回复
primes 类实现了IEnumerable接口吗?
puler 2013-02-14
  • 打赏
  • 举报
回复
小生我怕怕 2013-02-14
  • 打赏
  • 举报
回复
学习了~~~~~
KevinChan89 2013-02-14
  • 打赏
  • 举报
回复
foreach使用的类也不一定必须继承IEnumerable接口,但必须具有GetEnumerator()的方法实现,该方法实现返回值又必须为具有Current的属性和实现MoveNext()的方法的类的实例,编译器称这个概念为“Duck typing”,来自于英语俗语“如果走起路来像鸭子,叫起来像鸭子,那么肯定是一只鸭子”,就是长得像就OK。

    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            foreach (int intDemo in myClass)
            {
                Console.WriteLine(intDemo);
            }

            Console.ReadLine();
        }
    }

    class MyClass
    {
        private Stack<int> stack = new Stack<int>();
        private Stack<int>.Enumerator enumerator = new Stack<int>.Enumerator();
        
        public MyClass()
        {
            stack.Push(1);
            stack.Push(2);
        }

        public IEnumerator<int> GetEnumerator()
        {
            enumerator = this.stack.GetEnumerator();
            return enumerator;
        }
    }
ohkuy 2012-06-08
  • 打赏
  • 举报
回复
foreach只能遍历实现了IEnumerable接口的类,如int[],List<T>,IEnumerable<T>等等,
你要让primes实现IEnumerable,或者在primes类中添加一个long[]属性,
再用foreach遍历这个属性

primes pF = new primes(2, 1100);
long[] ps=pF.GetLongs;
foreach (long i in ps)
Console.Write("{0}", i);
__天涯寻梦 2012-06-08
  • 打赏
  • 举报
回复
primes 这个类型怎么定义的

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧