我试图让以下代码编译,但在VS2008中遇到错误.谁能告诉我哪里出错了?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace dummy
{
public class NaturalNumbersSequence : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
for (int i = 1; i <= 1000; i++)
yield return i;
}
IEnumerator IEnumerable.GetEnumerator()
{
for (int i = 1; i <= 1000; i++)
yield return i;
}
}
class Program
{
static void Main(string[] args)
{
foreach (int i in new NaturalNumbersSequence())
Console.WriteLine(i);
}
}
}
Run Code Online (Sandbox Code Playgroud)
ang*_*son 24
好吧,我得到的第一个编译器错误是它抱怨:
使用泛型类型'System.Collections.Generic.IEnumerator'需要'1'类型参数
这是第16行,这一个:
IEnumerator IEnumerable.GetEnumerator()
Run Code Online (Sandbox Code Playgroud)
通过为System.Collections命名空间添加using指令来修复它(提示:将光标放在IEnumerator之后,在单词末尾的r上,然后按Ctrl +.(ctrl + dot-key),它应该建议你添加一个"使用System.Collections;"指令,做那个).
然后它编译并运行.这符合你的期望吗?
另外,请注意,您应该始终发布您获得的实际错误消息,这样我们就不会咆哮错误的树,如果您的代码出现其他问题,我们乍看之下就没有看到.
另外,你可以IEnumerable<T>通过从另一个方法调用其中一个方法来简化这个非常常见的实现,因此我将简化第二个方法的实现,如下所示:
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator(); // this will return the one
// available through the object reference
// ie. "IEnumerator<int> GetEnumerator"
}
Run Code Online (Sandbox Code Playgroud)
这样您只需实现一次实际的枚举器代码.
最后看到Earwicker的回答,它显示了更好的(至少在我看来)编写这整个代码的方法.
不确定为什么你会收到错误,但这不会更简单吗?
public static class NumbersSequence
{
public static IEnumerable<int> Naturals
{
get
{
for (int i = 1; i <= 1000; i++)
yield return i;
}
}
}
class Program
{
public static void Main(string[] args)
{
foreach (int i in NumbersSequence.Naturals)
Console.WriteLine(i);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18833 次 |
| 最近记录: |