2017-06-30 5 views
0

私は自分のBASIC言語を開発していました。c#: "if" weird

tokens[1] = 3; 
tokens[3] = 3; 
tokens[2] = "=="; 

と私のコンソールの出力は、本当に奇妙です

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! 

私は何が起こっているか分かりません、なぜ出力が偽であるのか! 誰かが私を助けることができますか?

+0

あなたがプログラムをステップ実行するとき、何が起こりますか? – mrsargent

+0

firstElementとsecondElementの値は何ですか?あなたが言ったことを正確に表示しています。 – hRdCoder

+4

'firstElement.Equals(secondElement)'を使用する必要があります。問題は '=='は 'object'の参照平等を実行することです。オブジェクトは両方とも同じボックス化された値「3」を含んでもよいが、同じオブジェクトではなく、同じ内容の2つの異なるオブジェクトである。 – Kyle

答えて

4

これは、ボクシングの整数値であり、それぞれ(ボックス)が別のインスタンスであるため、比較が失敗するためです。

変更

object firstElement = 3; 
object secondElement = 3; 

int firstElement = 3; 
int secondElement = 3; 

か、のことを知っていますが、ここで

object firstElement = tokens[1]; 
object secondElement = tokens[3]; 

firstElement.Equals(secondElement)

+0

さん、働いてくれてありがとう! – Natchuz

4

見るためにあなたの比較子を変更しますとsecondElementの両方が実際にはInt32sの値であり、値がであるため、実行時環境ではそれらがオブジェクトとして認識されます。これは、値をオブジェクトの配列に配置して(オブジェクトを想定している)オブジェクト変数に割り当てるためです。

構造体の値は、それぞれ異なるオブジェクトに囲まれています。 ==を使って異なるオブジェクトを比較すると、デフォルトでは等価参照になります。あなたの値は2つの異なるオブジェクトに囲まれているので、結果はfalseです。ボクシングはどのように動作するかの詳細については

、これを読んで:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/boxing-and-unboxing

+0

@MeirionHughesまあ、質問は簡単です。私はデバッグに関するある種の皮肉なコメントをしましたが、正直なところOPはうまくいっているかもしれませんし、デバッグプロセスが「これはボクシングされました」という叫び声ではないので、彼が見ている結果に困惑しています。削除して代わりに答えました。しかし、それは間違いなく境界線であり、努力していない質問については回答をdownvoteすることは合理的です(私の意見でも)。 – Will