2013-09-29 97 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

相关问题