gpt4 book ai didi

c# - 托管 C++ : Strings in List is not passed back to caller

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:52 25 4
gpt4 key购买 nike

我有一个调用 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"));
}

最佳答案

您需要 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");
}
}

请注意,“列表”是通过引用传递的,因此当您分配一个新对象时,它将更改传递给函数的原始变量。

等效的 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

关于c# - 托管 C++ : Strings in List is not passed back to caller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1830716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com