2017-07-07 11 views
0

このコードで何が起こっているのかを説明してください(//動作しません) Equals ==演算子の代わりに。しかし、私はここでいくつかの理解を欠いています。ありがとう。C#ArrayListの項目(連結文字列)と比較したときの文字列の比較が機能しない

編集:ここでの目標は、コンパイラ/ランタイムレベルで何が起こっているのかを詳しく知りたいのではなく、機能させることです。

 string first = "string1"; 
     string full = first + " string2"; 

     Debug.Assert(full == "string1 string2", "Expected to be same.");//WORKS 
     Debug.Assert(first + " string2" == "string1 string2", "Expected to be same.");//WORKS 

     var list = new ArrayList(); 
     list.Add(full); 
     list.Add(first + " string2"); 

     Debug.Assert(list[0] == "string1 string2", "Expected to be same.");//DOESN'T WORK 
     Debug.Assert(list[1] == "string1 string2", "Expected to be same.");//DOESN'T WORK 

     list.Add("string1 string2"); 
     Debug.Assert(list[2] == "string1 string2", "Expected to be same.");//WORKS 
+2

なぜ 'ArrayList'を使用していますか? .NET 1.1のプログラムとの下位互換性のためには.NETフレームワーク内にあり、新しい開発には使用しないでください。 –

+0

右しかし、これは生産コードではありません。私がコンパイラ/ランタイムレベルで何が起こっているのかを理解しようとしているうちに、私は動き出していました。 –

+0

'string'ではなく' object'に文字列を格納するだけで、同じ状況を作り直すことができます –

答えて

0

問題はリストが一般的ではないため、オブジェクトを文字列と比較できないためです。

var list = new List<string>(); 
list.Add(full); 
list.Add(first + " string2"); 

Debug.Assert(list.ElementAt(0) == "string1 string2", "Expected to be same."); 

string[]を使用することもできます。

+0

しかし、ここではオブジェクトと実際に文字列を比較していますか?なぜ私はConsole.WriteLine(list [0] .GetType());を行ったのですか?それはSystem.Stringと言います。 List/ArrayListにgenericを追加した後でも、コンパイラはその値を文字列としてキャストしませんか?思考? –

0

おそらくタイプがlist[0]であるのはオブジェクトです。 ToString()メソッドを次のように追加した場合:
Debug.Assert(list[0].ToString() == "string1 string2", "Expected to be same.");

+0

ええ、これに同意したかもしれません。しかし、私はConsole.WriteLine(list [0] .GetType());を実行します。それはSystem.Stringと言います。そして私の目標はそれを機能させることではないということです。なぜこれが失敗しているのか、何がフードの下で起こっているのかを理解しようとするだけです –