我在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);
答案 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对象时才有用。