2009-02-26 98 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中的原始實例是分開的。

你可以發佈一個更透徹的代碼示例嗎?