C# 当我期望它是真的时,为什么它是假的?

C# 当我期望它是真的时,为什么它是假的?,c#,.net,C#,.net,第一行是真的,第二行是假的。htmlOut和s2是StringWriter对象 bool b = s2.ToString() == htmlOut.ToString(); ret = htmlOut.Equals(s2); 我期望b为true,但为什么ret为false?Equals的默认实现支持引用类型的引用相等,以及值类型的位相等。htmlOut类型是否具有非默认重写的Equals方法 在本例中,它似乎不是,它告诉您它们是不同的实例,不管它们的语义值是否匹配。String

第一行是真的,第二行是假的。htmlOut和s2是StringWriter对象

    bool b = s2.ToString() == htmlOut.ToString();
    ret = htmlOut.Equals(s2); 

我期望b为true,但为什么ret为false?

Equals的默认实现支持引用类型的引用相等,以及值类型的位相等。htmlOut类型是否具有非默认重写的Equals方法


在本例中,它似乎不是,它告诉您它们是不同的实例,不管它们的语义值是否匹配。

StringWriter
使用内部
StringBuilder
进行写入
StringWriter.ToString()
返回由
StringBuilder
生成的字符串


StringWriter
不重写
object.Equals()
因此
StringWriter.Equals()
比较两个对象是否是相同的引用,而不是它们的字符串表示是否相等

htmlOut.ToString().Equals(s2.ToString());

这将返回true

StringWriter不重写object.Equals

htmlOut.Equals(s2);
相当于:

object.ReferenceEquals(htmlOut, s2);

因此,对于StringWriter.Equals与==?
StringWriter
没有实现默认为引用相等的
=
运算符,因此是的。不完全是这样<代码>htmlOut.Equals(s2)htmlOut
null
对象时,code>将抛出
NullReferenceException
,ReferenceEquals(htmlOut,s2)将不显示。