对象上多个相同的强制转换
本文关键字:转换 对象 | 更新日期: 2023-09-27 18:15:05
我在查看文章,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;
中它的cast两次?我检查了,但结果相同,
((int)(int)e.Current).GetType() = Int32
((int)e.Current).GetType() = Int32
(e.Current).GetType() = Int32
说明见Q/A第7页
Pavel Minaev [MSFT] 2009年11月15日11:15 PM
@Brad:根据foreach在语言规范中的定义,有两种类型涉及:元素类型(通常是Current属性的类型)枚举数的类型),以及迭代变量类型(即您要使用的类型)在foreach中显式指定,如果使用,则与元素类型相同"var"。foreach展开的相关行如下:
v = (V)(T)e.Current;
据我所知,(T)强制转换几乎总是无操作的,因为它对应于电流的类型。似乎唯一的情况是当你在数组上迭代时(spec在这种情况下,要求在IEnumerable之上使用IEnumerable,并且元素类型不是从当前类型派生,而是从数组类型派生)。
我想知道为什么不简单地重新定义为使用IEnumerable for数组也可以(这将消除对特殊情况的需要,如以及演员阵容)——据我所知,不会有什么变化
绝对没有理由。时期。
这真的只是一个打字错误(是的,这种情况甚至发生在Eric身上)。
我在代码中看到的是两个类型的双强制转换,否则会失败。就像这个例子:
double? nullableDouble = 3;
int myInteger = (int)(double)nullableDouble;