c#中跟踪引用的冲突

时间:2016-07-22 16:06:13

标签: c# .net c++-cli

我在C ++ / CLI中编写了托管类:

public ref class Foo
{
public:
   void func1(Foo% foo){}
   void func2(Foo^% foo){}
};

然后,我在c#console应用程序中使用方法,如下所示:

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);

1 个答案:

答案 0 :(得分:2)

   void func1(Foo% foo)

这是隐式引用。如果Foo是非托管类型,则它是native C++ feature,相当于Foo&。 C ++ / CLI也支持它,它试图像C ++一样 - 尽可能地。对于有时候的错误,如果他们允许Foo^&,那么可能会更清楚。

但它不是其他.NET语言的功能,如C#,正如您所发现的那样,它们没有任何语法来表达同样的事情。至少是因为这些语言试图尽可能地隐藏对象引用和值之间的差异。有时是一个错误。它也不是MSIL功能,需要C ++ / CLI编译器来实现它。很像C ++编译器。参数类型实际上是元数据中的Foo^,但使用a [modopt]来注释方法参数。足够让C#编译器知道它是禁果,太可能导致方法重载解决问题。

由于Foo是引用类型,因此您必须使用Foo^。或Foo^%如果您打算通过引用传递对象引用,仅在您的方法创建新的Foo对象时才有用。