2

下面是一个简单的 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中的值也不会改变。

我应该在上面的代码段中修改什么以便永久更改值?

4

2 回答 2

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
}

你没有得到一个编译器警告,告诉你你正在将一个非常量引用绑定到一个临时对象吗?

于 2012-05-28T19:11:04.397 回答
1

您在这里没有从编译器那里获得帮助。这是 C# 中的CS1656 错误,但 C++/CLI 编译器忘记为您提供诊断。

foreach 迭代变量是IEnumerable<T>::Current属性的别名。它只有一个 getter,它没有一个 setter。所以它永远不能更新底层集合。您需要在此处使用普通的 for() 循环。

于 2012-05-28T19:41:20.770 回答