为什么运算符不能在C ++中工作 - CLI?

时间:2013-09-29 19:06:40

标签: visual-studio-2010 build c++-cli compare operators

根据微软的说法,C ++中的运算符在visual studio C ++ 2010中是相同的 http://msdn.microsoft.com/en-us/library/x04xhy0h.aspx
但是,请查看以下版本:

int^ number = 32;

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

构建失败 '&LT;' :'System :: Int32 ^'未定义此运算符或转换为预定义运算符

可接受的类型
if (number <= 100)
    MessageBox::Show("The number is not greater than 100");

构建失败 '&lt; =':'System :: Int32 ^'没有定义此运算符或转换为预定义运算符可接受的类型

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

构建成功...但是不显示消息。

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

构建成功..显示消息。 (为什么?等式的运算符是==)

为什么会这样?

1 个答案:

答案 0 :(得分: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

...由于您要比较引用而不是值,>>=<=<没什么意义。

在你的上一个案例中,你 32分配给number,然后检查该表达式的结果(本身是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;

编辑:根据Ben Voigt更正确的解释重写。