c#中的跟踪引用冲突

Conflict of tracking reference in c#

我用 C++/CLI 编写了托管 class:

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