好吧,这可能非常简单但是,我有下面的“检查”(不是同时),并且第一个ALWAYS评估为TRUE,而第二个SEEMS工作.这实际上发生在行值为数字或布尔值的每个地方(日期似乎很好……).
如果我遍历Debug中的代码,它会将row [“PersonID”]的值显示为162434,与tbxPersonID.EditValue相同.这只是一个关于编程的基本和初学真理,我在我的大学自我教育中错过了吗?
看来,如果我首先将所有问题都转换为字符串,我会很好,我只想知道我是否正确,是否有一般规则我需要做什么类型?
不起作用
if (row["PersonID"] != tbxPersonID.EditValue) { row["PersonID"] = tbxPersonID.EditValue; } if (row["CitizenFlag"] != chkCitizen.EditValue) { row["CitizenFlag"] = chkCitizen.EditValue; _whatChanged.Add("CitizenFlag"); }
作品
if (row["PersonID"].ToString() != tbxPersonID.EditValue.ToString()) { row["PersonID"] = tbxPersonID.EditValue; } if (row["CitizenFlag"].ToString() != chkCitizen.EditValue.ToString()) { row["CitizenFlag"] = chkCitizen.EditValue; _whatChanged.Add("CitizenFlag"); }
解决方法
row [“PersonID”]是object类型,这意味着!=和==将使用引用标识.基本上你是在比较盒装值.
如果您使用:
if (!object.Equals(row["PersonID"],tbxPersonID.EditValue))
然后你会得到价值平等语义,我怀疑你会没事 – 假设tbxPersonID确实是一个int,无论是盒装还是非盒装.
只是为了使事情具体化,这里有一个简短但完整的例子来展示我在说什么:
using System; class Test { static void Main() { object first = 2; object second = 2; // Compares reference equality: false Console.WriteLine(first == second); // Compares value equality: true Console.WriteLine(object.Equals(first,second)); } }