下面是一个简单的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
简而言之,即使我使用跟踪指针将其值更改为“TEST”, TestList 中的值也不会更改。
我应该在上面的代码段中修改哪些内容,以便永久更改该值?
答案 0 :(得分: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引用?
答案 1 :(得分:1)
您在这里没有得到编译器的帮助。它是C#中的CS1656 error,但C ++ / CLI编译器忘记为您提供诊断。
foreach迭代变量是IEnumerable<T>::Current
属性的别名。只有一个吸气剂,它没有一个二传手。所以它永远不会更新底层集合。你需要在这里使用plain for()循环。