对象上多次相同的强制转换

时间:2015-09-29 08:49:21

标签: c# .net

我正在查看文章http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

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

3 个答案:

答案 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;