我有一个C#.Net控制台应用程序,它调用C ++ .Net类库。但是,执行以下应用程序时,列表变为空!
如果我删除旁边注释中指示的行,则代码可以正常工作。我不明白这个的原因。
如果我想在C ++类库中为列表重新分配内存,就像我在下面尝试的那样,那么正确的方法是什么?
C#2005控制台应用程序
class Caller
{
static void Main(string[] args)
{
Callee callee = new Callee();
List<String> s = new List<String>();
callee.DoSomething(s);
Console.WriteLine(s.Count); // Prints out 0
}
}
C ++ 2005类库
public ref class Callee
{
public:
void DoSomething(List<String^>^ list);
};
void Callee::DoSomething(List<String^>^ list)
{
list = gcnew List<String^>(); // Remove this line and it works
list->Add(gcnew String("Test String 1"));
list->Add(gcnew String("Test String 2"));
}
答案 0 :(得分:1)
您希望在C ++ / CLI中等效于此(C#代码如下)
class Caller
{
static void Main(string[] args)
{
Callee callee = new Callee();
List<String> s = new List<String>();
callee.DoSomething(ref s);
Console.WriteLine(s.Count); // Prints out 0
}
}
public class Callee
{
void DoSomething(ref List<string> list)
{
list = new List<string>();
list.Add("Test String 1");
list.Add("Test String 2");
}
}
请注意,'list'是通过引用传递的,因此当您分配新对象时,它将更改传递给函数的原始变量。
等效的C ++ / CLI语法如下:
public ref class Callee
{
public:
void DoSomething(List<String^>^% list);
};
void Callee::DoSomething(List<String^>^% list)
{
list = gcnew List<String^>();
list->Add(gcnew String("Test String 1"));
list->Add(gcnew String("Test String 2"));
}
在该类型中添加“%”将使列表作为跟踪引用传入。
有关跟踪参考的详细信息,请访问http://en.wikipedia.org/wiki/C%2B%2B/CLI#Tracking_references