C# c:“如果”工作起来很奇怪

C# c:“如果”工作起来很奇怪,c#,if-statement,C#,If Statement,我在发展自己的基本语言。当我发出“如果”命令时,我得到了: object firstElement = tokens[1]; object secondElement = tokens[3]; string conditionType = tokens[2]; bool resultOfCondition = false; if (conditionType == "==") { if (firstElement == secondElement) { re

我在发展自己的基本语言。当我发出“如果”命令时,我得到了:

object firstElement = tokens[1];
object secondElement = tokens[3];
string conditionType = tokens[2];
bool resultOfCondition = false;

if (conditionType == "==") 
{
    if (firstElement == secondElement) 
    {
        resultOfCondition = true; 
        Console.WriteLine("DEBUG: true!");
    } 
    else 
    {
        resultOfCondition = false;
        Console.WriteLine("DEBUG: false!");
    }
} 
else if (conditionType == "!=") 
{
} 
else 
{
    throw new System.ArgumentException("It's not any type of contidion!", "original");
}
在哪里

我的控制台的输出非常奇怪:

DEBUG: false!
我不知道发生了什么,为什么输出是假的!
有人能帮我吗?

这是因为您正在装箱整数值,而每个框都是一个单独的实例,因此比较将失败

改变

 object firstElement = 3;
 object secondElement = 3;

或者将比较器更改为firstElement。EqualssecondElement查看此处

object firstElement = tokens[1];
object secondElement = tokens[3];
虽然您知道firstElement和secondElement实际上都是值为3的Int32s,但运行时环境将它们视为对象。这是因为您将值放入对象数组中,然后将其分配给对象变量

您的结构值现在已装箱,每个值位于不同的对象中。当您使用==比较不同的对象时,它默认为引用等价。由于您的值被装箱在两个不同的对象中,因此结果为false


有关装箱工作原理的更多信息,请阅读以下内容:

单步执行程序时会发生什么?firstElement和secondElement的值是多少?它正显示您告诉它的内容。您应该使用firstElement。等于secondElement。问题是==执行对象的引用相等。这两个对象可能都包含相同的装箱值3,但它们不是相同的对象,它们是具有相同内容的两个不同对象。@dasblinkenlight标记[0]为IF。我用它来检查它是什么命令。@Kyle它工作了!谢谢你的帮助@Meirionhoughes嗯,问题有点简单。我对调试给出了一种讽刺性的评论,但老实说,OP很可能会这样做,并且对他看到的结果感到困惑,因为调试过程不会尖叫这是装箱的。删除并改为回答。但这绝对是边缘化的,而且在我看来,对那些没有表现出努力的问题投反对票也是合理的。
 int firstElement = 3;
 int secondElement = 3;
object firstElement = tokens[1];
object secondElement = tokens[3];