2013-09-29 133 views
2

據微軟稱,在C++在Visual Studio中的同一運營商C++ 2010 http://msdn.microsoft.com/en-us/library/x04xhy0h.aspx
但是,看看下面的構建:爲什麼操作員不能在C++ - CLI中工作?

int^ number = 32; 

if (number < 100) 
    MessageBox::Show("The number is not greater than 100"); 

構建失敗 '<':「系統::的Int32^「不限定此運算符或轉換到類型接受的預先規定的操作

if (number <= 100) 
    MessageBox::Show("The number is not greater than 100"); 

建立失效 」 < =「:」 SYSTE m :: Int32 ^'未定義該運算符或轉換爲預定義運算符可接受的類型

if (number == 32) 
    MessageBox::Show("The is equal to 32"); 

構建成功...但是不顯示消息。

if (number = 32) 
    MessageBox::Show("The is equal to 32"); 

構建成功..顯示消息。 (爲什麼?等號的運算符是==)

爲什麼會發生這種情況?

回答

2

int^宣佈handle to an object。每當你直接引用number,你實際上引用了一個盒裝整數(有點相當於C#中的(object)32)。

另外,與整數文字進行比較時,對象句柄沒有定義<<=(或>>=)運算符。原因可以從以下內容中扣除:

他們這樣做,但是定義了==運算符。但爲了比較,你要比較的文字值將被隱式裝箱,作比較(有點),相當於這個C#代碼:

object number = 32; 
if (number == (object)32) 
    MessageBox.Show("The number is equal to 32"); 

這比較會檢查是否引用是相同的。他們不是 - 他們是兩個不同的對象。因此:

int^ number = 32; 
if (number == 32) 
    MessageBox::Show("The number is equal to 32"); // isn't displayed 

...因爲你要比較的引用而不是值,>>=<=<將毫無意義。

在你過去的情況下,你分配32number,然後檢查是否該表達式(它本身是32)的結果爲0不同 - 它是,所以顯示的消息。這就是if在C++(和C)中所做的 - 在C#中,number = 32確實有結果32,但由於if需要布爾值,所以會出現編譯器錯誤。

「解決方案」:取消引用int^

if (*number == 32) 
    MessageBox::Show("The number is equal to 32"); 

...或者乾脆使用int

int number = 32; 

編輯:重寫了基於本福格特的更正確的解釋。

+0

.net確實爲句柄定義了運算符...用於引用類型。但這是一種價值類型,沒有理由去處理它。 –

+1

並且不,它不會比較地址與32 ... 32個盒子,然後檢查兩個盒子的參考身份,這將始終是錯誤的。 –

+0

@BenVoigt - 有趣...雖然我知道C++和.NET,但我承認我並不完全熟悉C++/CLI - 所以我實際上已經測試了上述聲明,並將'number'與整數地址進行了比較通過檢查(例如'number == 0x1234abcd')看起來確實產生了'true'。必須做一些疏忽。 – JimmiTh

相關問題