2016-07-22 68 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對象時纔有用。