while(e.MoveNext())
{
int m; // INSIDE
m = (int)(int)e.Current;
funcs.Add(()=>m);
}
我搜索过它,但是没有找到为什么在m = (int)(int)e.Current;
投票两次?我确实检查了但两者都有相同的结果和
((int)(int)e.Current).GetType() = Int32
((int)e.Current).GetType() = Int32
(e.Current).GetType() = Int32
答案 0 :(得分:2)
说明在Q / A的第7页
Pavel Minaev [MSFT] 2009年11月15日下午11:15
@Brad:根据 在语言规范中定义foreach,有两种类型 涉及:元素类型(通常是Current属性的类型) (枚举器)和迭代变量类型(这是你的类型) 如果使用,在foreach中显式指定,或与元素类型相同 “VAR”)。 foreach扩展的相关行是:v = (V)(T)e.Current;
据我所知,(T)阵容几乎总是一个无操作, 因为它将对应于Current的类型。看似唯一的案例 当你在一个数组上进行迭代时(规范),这不是这样的 在这种情况下,需要使用IEnumerable而不是IEnumerable 元素类型不是从Current派生的,而是从数组类型派生的。
我想知道为什么不是简单地重新定义使用IEnumerable 数组也是如此(这将消除特殊情况的需要,如 以及演员) - 据我所见,改变不会 可以观察到用户......
答案 1 :(得分:1)
绝对没有理由。周期。
答案 2 :(得分:0)
这真的只是一个错字(是的,这甚至发生在Eric身上)。
我在代码中看到的是具有两种类型的双重转换,否则会失败。像这个例子:
double? nullableDouble = 3;
int myInteger = (int)(double)nullableDouble;