【发布时间】:2016-07-22 16:06:12
【问题描述】:
我用 C++/CLI 编写了托管类:
public ref class Foo
{
public:
void func1(Foo% foo){}
void func2(Foo^% foo){}
};
然后,我在 c# 控制台应用程序中使用方法,如下所示:
Foo foo = new Foo();
Foo foo2 = new Foo();
foo.func1(ref foo2); // getting error
foo.func2(ref foo2); // OK
我真的不明白这个区别。 C# 将 func1 和 func2 的签名视为:
void func1(Foo);
void func2(ref Foo);
【问题讨论】:
-
^表示ref。你不明白什么? -
我以为^是指针的意思
-
哦,我好像明白了,谢谢。
-
@SLaks, nope
^表示 托管句柄,它在 C# 中隐含用于引用类型,等效于 C++ 中的*。如果Foo是引用类型,^%的含义与 C# 的ref相同。%单独是一个跟踪引用,它在 C# 中没有等价物 - 就像 C++ 中的&一样,将其视为不能为空的对象引用。如果Foo是值类型,它也等效于C# 中的ref。 C++/CLI 对这些东西非常更加明确。在 OP 的示例中,%添加了ref语义,^只是由于Foo是引用类型而需要的。