2016-07-22 40 views
0

我写的托管类C++/CLI:冲突在C#中的跟踪参考

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

'^'表示'ref'。你不明白什么? – SLaks

+0

我以为^意味着指针 – LmTinyToon

+0

哦,好像我明白了,谢谢。 – LmTinyToon

回答

2
void func1(Foo% foo) 

这是一个隐式引用。这是一个native C++ feature,相当于Foo&如果Foo是一个非托管类型。 C++/CLI也支持它,它尽可能像C++一样。有时候,如果他们允许Foo^&取而代之,它可以说是更清晰了。

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

由于Foo是一种参考类型,所以您确实必须使用Foo^。或Foo^%如果您打算通过引用传递对象引用,那么只有在您的方法创建新的Foo对象时才有用。