C#等于返回true,但==返回false
以下是我的数据集中的部分数据: 看看第16行的数据和第17行的数据(partno列),值是“CTS04”,但当我稍后进行检查时,会出现以下情况: partno列数据类型为字符串,17行数据是使用以下代码手动创建的:C#等于返回true,但==返回false,c#,winforms,C#,Winforms,以下是我的数据集中的部分数据: 看看第16行的数据和第17行的数据(partno列),值是“CTS04”,但当我稍后进行检查时,会出现以下情况: partno列数据类型为字符串,17行数据是使用以下代码手动创建的: DataRow newRow = ds.Tables[tableToAdd].Rows.Add(); newRow["partno"] = ds.Tables[tableToAdd].Rows[i - 1]["partno"]; 所以,从逻辑上讲,我只是试图从上面的行复制par
DataRow newRow = ds.Tables[tableToAdd].Rows.Add();
newRow["partno"] = ds.Tables[tableToAdd].Rows[i - 1]["partno"];
所以,从逻辑上讲,我只是试图从上面的行复制partno,但是为什么当我使用“==”操作符检查值时,它返回false?==比较数据行而不是该行的值。这两行不同,因此结果为false。在第二种情况下,它比较了值,因为值相同,所以结果为真。==比较数据行而不是该行的值。这两行不同,因此结果为false。在第二种情况下,它比较了值,因为值相同,所以结果为真。对于对象,相等运算符(=)执行“ReferenceEquals”。在数字和字符串等简单类型中,运算符执行值比较
ds.Tables[tableToAdd].Rows[i-1][“partno”]
不返回简单值。
尝试
ds.Tables[tableToAdd].Rows[i-1][“partno”].GetType()代码>对于对象,相等运算符(=)执行“ReferenceEquals”。在数字和字符串等简单类型中,运算符执行值比较
ds.Tables[tableToAdd].Rows[i-1][“partno”]
不返回简单值。
尝试ds.Tables[tableToAdd].Rows[i-1][“partno”].GetType()
返回作为对象键入的内容。因此,当您执行==
操作时,将使用对象
类型的相等比较,并且只有在这两个对象之间存在引用相等时,才会使用true
因为您的值实际上是字符串,所以您希望使用基于字符串的比较。如果将它们强制转换为字符串,则只能使用=
执行此操作。或者使用字符串类型重载的.Equals()
进行比较:
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
有关更多信息,请参阅和。返回键入为对象的内容。因此,当您执行==
操作时,将使用对象
类型的相等比较,并且只有在这两个对象之间存在引用相等时,才会使用true
因为您的值实际上是字符串,所以您希望使用基于字符串的比较。如果将它们强制转换为字符串,则只能使用=
执行此操作。或者使用字符串类型重载的.Equals()
进行比较:
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
有关更多信息,请参见和。尝试在两侧使用Trim()
,请参阅@X-TECH,但问题似乎不是因为空格,正如您在我的第二个屏幕截图中所看到的,如果我将对象转换为字符串,它将返回true…您在每一个位置都在谈论第16行和第17行,但是您显示的即时窗口代码,你要查15号和16号。请您消除混淆好吗?尝试在两侧使用Trim()
,请参见@X-TECH,但问题似乎不是因为空格,正如您在我的第二个屏幕截图中所看到的,如果我将对象转换为字符串,它将返回true…您在每一个地方都在谈论第16行和第17行,但是您显示的即时窗口代码,你要查15号和16号。请你澄清一下混乱的情况好吗?