2012-05-28 58 views
2

下面是一個簡單的C++/CLI示例。在C++/CLI中更改通用列表中成員的值

// TestCLR.cpp : main project file. 

#include "stdafx.h" 

using namespace System; 

int main(array<System::String ^> ^args) 
{ 
    System::Collections::Generic::List<String^> TestList; 

    for(int i = 0; i < 10 ; i++) 
    { 
     TestList.Add(i.ToString()); 
    } 

    for each(String^% st in TestList) 
    { 
     st += "TEST"; 
     Console::WriteLine(st); 
    } 

    for each(String^ st in TestList) 
    { 
     Console::WriteLine(st); 
    } 

    return 0; 
} 

我得到以下輸出:

0TEST 
1TEST 
2TEST 
3TEST 
4TEST 
5TEST 
6TEST 
7TEST 
8TEST 
9TEST 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 

總之,價值觀裏面TestList即使我使用跟蹤指針改變其值改爲「TEST」不改變。

我應該在上面的代碼段中修改哪些值,以便永久更改值?

回答

1

你有System::Collections::Generic::List,它使用屬性來訪問項目。您無法將跟蹤引用綁定到某個屬性,而是最終引用該值的臨時副本。

該代碼適用於數組,但foreach不能用於在容器中就地變異元素。你需要一個for循環,因爲你需要索引覆蓋列表元素:

for(int i = 0, cnt = TestList.Count; i < cnt; ++i) 
{ 
    TestList[i] += "TEST"; 
    Console::WriteLine(TestList[i]); 

    // doesn't work right: String^% st = TestList[i]; 
    // since TestList[i] is not an lvalue, it's a function call to a getter method 
} 

你沒收到編譯器警告,告訴你,你是結合非const引用到臨時對象?

+0

不,我沒有得到任何警告。 –

+0

使用for循環工作來修改TestList的值。 –

1

您在這裏沒有從編譯器獲得幫助。它是C#中的CS1656 error,但C++/CLI編譯器忘記給你一個診斷。

foreach迭代變量是IEnumerable<T>::Current屬性的別名。它只有一個吸氣劑,它沒有吸氣劑。所以它永遠不會更新基礎集合。你需要在這裏使用plain作爲()循環。

+0

由於C#根本不支持跟蹤引用,因此C#案例難以比擬。此外,問題並不在於該屬性缺少setter,而是跟蹤引用不綁定到屬性的存取函數,而只是綁定到從getter返回的臨時數據。這只是VC++ bug的另一個表現,它允許將非''constst'引用綁定到臨時對象,儘管被標準禁止了。 –

+0

@HansPassant是的,我嘗試了C#中的同一個例子,當我嘗試在foreach中分配值時,intellisense本身顯示錯誤。 –

相關問題