关于winforms:C#Equals返回true但==返回false

C# Equals return true but == return false

本问题已经有最佳答案,请猛点这里访问。

以下是我的数据集中的部分数据:

enter image description here

看一看第16行的数据和第17行的数据(partno列),值是"cts04",但稍后进行检查时,会出现以下情况:

enter image description here

partno列数据类型为string,17行数据是使用以下代码手动创建的:

1
2
DataRow newRow = ds.Tables[tableToAdd].Rows.Add();
newRow["partno"] = ds.Tables[tableToAdd].Rows[i - 1]["partno"];

所以,从逻辑上讲,我只是想从上面的行复制partno,但是为什么当我使用"=="操作符检查值时,它返回false?


DataRow[index]返回键入为object的内容。因此,在执行 == 操作时,将使用object类型的相等比较,只有当这两个对象之间存在引用相等时,这才是true

因为您的值实际上是字符串,所以您需要使用基于字符串的比较。如果您将它们强制转换为字符串,则只能使用==来实现这一点。或者使用字符串类型重载的.Equals()进行比较:

1
2
3
4
5
6
object a ="foo";
object b = new StringBuilder("foo").ToString(); // this is to make sure that we get a new string object instead of the constant"foo" that is created at compile-time

Console.WriteLine(a == b); // false
Console.WriteLine((string)a == (string)b); // true
Console.WriteLine(a.Equals(b)); // true

有关详细信息,请参阅为什么使用string.equals over==?以及==和equals()之间的c差。


对于对象,相等运算符(==)执行"referenceEquals"。在简单类型(如数字和字符串)中,运算符执行值比较。

ds.Tables[tableToAdd].Rows[i - 1]["partno"]不返回简单值。试试ds.Tables[tableToAdd].Rows[i - 1]["partno"].GetType();


==比较数据行而不是该行的值。这两行都不同,所以结果是错误的。在第二种情况下,它比较了值,因为值相同,所以结果是真的。