以下C#程序完成我的预期,即输出“First”,“Second”,“Third”。但是,当我将Main中的foo类型更改为dynamic时,会引发一个异常,说明:
“无法将类型'MyProgram.Program'隐式转换为'System.Collections.IEnumerable'。存在显式转换(您是否错过了演员?)”
为什么将类型更改为动态会以这种方式破坏代码?
谢谢!
using System;
namespace TestForEach
{
class Program
{
private int idx = -1;
public Program GetEnumerator() {
return this;
}
public string Current
{
get {
string[] arr = { "First", "Second", "Third" };
return arr[idx];
}
}
public Boolean MoveNext()
{
return ++idx < 3;
}
static void Main(string[] args)
{
Program foo = new Program();
foreach (var i in foo)
{
System.Console.WriteLine(i);
}
System.Console.ReadKey();
}
}
}
答案 0 :(得分:1)
我的猜测是因为你的Program
实现了适当的方法,以便被编译器视为迭代器。
使用dynamic关键字时,编译器无法检测到在可迭代上下文中正在使用Program
。因此,它不会生成适当的代码,以便在foreach
循环中使用它。
答案 1 :(得分:0)
我很惊讶它甚至编译。 Program
类需要实现IEnumerable
。