http://dev.csdn.net/Develop/article/41/41245.shtm

解决方案 »

  1.   

    规矩是人家定的,照着做就是了......对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回真,否则,返回假。对于除 string 类型以外的引用类型,如果两个操作数引用相同的对象,则 == 返回真。对于 string 类型,== 将比较字符串的值。
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/csref/html/vclrfEqualityOperator.htm确定两个 Object 实例是否相等,Object.Equals 方法
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemObjectClassEqualsTopic.htm
      

  2.   

    这很正常阿,s2赋值的时候,系统找到已经有一个同样的值,就直接使用那个地址,s3是复制了一个新的,所以地址不同,同样s4和s2是一个地址。over
      

  3.   

    我觉得楼上说的都没说到一个地方,那就是一个关键是:(object) s1 == s2 这句话其实的意思是:((object) s1) == s2 
    而不是:(object) (s1 == s2)于是它就代表两个object相比较,而不是两个string相比较,因为string可以cast成object, 反过来不可以。
    而对象比较,比较的是地址,而不是指。
    前两个是因为编译的时候系统作了优化,指向一个"Test",所以地址是相等的。后面的话很显然,都不是一个对象,所以都是false。不知道我说得对不对,大家讨论一下。
      

  4.   

    如果是string之间比较的话,因为string对=符号做过重载,所以是比较值而不是比较地址的,所以 qyflaoda(调整心态) 的说法我觉得不对。
      

  5.   

    问题出在强类型转换为Object上,如果是值比较的话,如s2==s3肯定是true;这里是引用比较,因为s1,s2都是引用同一内存空间,所以它们相等;而s3是由copy创建的一个新实例,故与s1,s2不等。
      

  6.   

    Console.WriteLine( (object) (s1 == s2) );  // True
    Console.WriteLine( (object) (s2 == s3) );  // True
    Console.WriteLine( (object) (s4 == s3) );  // Truems-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/csref/html/vclrfEqualityOperator.htm
      

  7.   

    == 运算符请参见
    C# 运算符 | 7.9 关系和类型测试运算符 | != 运算符
    对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回真,否则,返回假。对于除 string 类型以外的引用类型,如果两个操作数引用相同的对象,则 == 返回真。对于 string 类型,== 将比较字符串的值。