2009-02-26 99 views
0

可能有人花时间在这里解释我的语言基础的:影响铸造为int在C#

int foo = myObject.SomeList.Count; 
for (int i = 0 ; i < foo ; i++) 
{ 
    myObject.SomeList.Add(bar); 
} 

进入一个无限循环,因为foo引用的是不断递增的值。修改第一行:

int foo = (int)myObject.SomeList.Count; 

使得它走,不知何故改变foo从参考一劳永逸的价值。这可能是教科书,但为什么会发生这种情况?

非常感谢

编辑:好,帕特里克提到,无限循环时没有事先存储为foo,演员是没有意义的,这是有意义的只发生。这确实是我在调试时最初想到的。因此,当演员修好它时,我感到惊讶。实际发生的事情是,当Visual Studio错误地认为我修复了编辑代码和执行代码之间的同步问题时,导致了错误的结论。

+0

哪个版本的.Net和c#? – zendar 2009-02-26 15:02:08

+0

请发布一个简短但完整的程序来演示此问题。一些可以直接粘贴到Visual Studio中的program.cs文件中,编译并运行的东西。 – 2009-02-26 15:57:37

回答

8

我在我的系统上试过这个,不能复制你的问题。我可以但用下面的代码复制它,也许这是你的意思:

// SomeList is not empty before the loop 
for (int i = 0; i < myObject.SomeList.Count; i++) 
{ 
    myObject.SomeList.Add(bar); 
} 

在这种情况下,我们不存储在一个int计数,所以我们每次添加到列表中的时候,我们是在比较我+1与Count + 1,因此是无限循环。

6

你确定吗?

int是一个值类型。这不应该发生。

Jon Skeet,来帮忙!

4

您描述的行为不能在C#中发生。在这两种情况下,您都明确声明foo的值是一个int。这是一种值类型。根据定义,foo指向的实例与myObject.SomeList.Count中的原始实例是分开的。

你可以发布一个更透彻的代码示例吗?