2017-07-07 70 views
0

请解释下面的代码发生了什么(// DOES NOT WORK部分) 我知道如果我宁愿使用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框架中向后兼容.NET 1.1程序,不应在新开发中使用。 –

+0

对!但这不是生产代码。我试图了解编译器/运行时级别正在发生的事情,只是一些随机场景。 –

+0

只需将字符串存储在“对象”而不是“字符串”中即可重新创建相同的情况。 –

回答

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之后,即使它们是通用的,编译器也不会将该值作为字符串进行转换?思考? –

0

也许是因为list[0]的类型是Object。 如果像这样添加ToString()方法:
Debug.Assert(list[0].ToString() == "string1 string2", "Expected to be same.");它应该工作

+0

是的,可以同意这一点。但是当我做一个Console.WriteLine(list [0] .GetType());它说System.String。顺便说一句,我的目标不是让它工作。试图理解为什么这个失败以及发生了什么 –