【发布时间】:2015-02-05 10:49:20
【问题描述】:
我有两个问题:
第一个问题:
我编写了一个 Scanner,它根据 Parser 的要求生成令牌流。
public class Scanner
{
public IEnumerator<Token> GetEnumerator()
{ //DO SOME STUFF HERE
yield return new Token(...);
}
}
public class Parser
{
IEnumerator<Token> iterator;
...
public Parser(Scanner scanner)
{
this.iterator = scanner.GetEnumerator();
...
}
public Token nextToken()
{
//generate the next token
iterator.MoveNext();//there is no need to test MoveNext()
return iterator.Current;//get the generated token
}
...
}
考虑到这实际上是我在整个框架中使用 Scanner 类的唯一情况,你认为这没问题还是Scanner 实现IEnumerable 更正确?
如果我没记错的话,编译器会做一些操作让Scanner无论如何都实现IEnumerable,对吗?
第二个问题:
假设Scanner实现IEnumerable,那么代码如下:
public class Scanner:IEnumerable<Token>
{
public IEnumerator<Token> GetEnumerator()
{
...
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();//I'M NOT SURE OF THIS!
}
我不明白IEnumerable.GetEnumerator() 的含义是什么以及我的实现是否正确。我知道这是必要的,因为Scanner 实现了IEnumerable<T> 而不是IEnumerable(否则 GetEnumerator() 就足够了,但是在Current 上我应该从对象到令牌进行低效的向下转换)。
谁能解释一下?
【问题讨论】:
标签: c# generics iterator ienumerable