比较类型对象的表达式

Ref*_*din 6 .net c# types typechecking

好吧,这可能非常简单但是,我有以下"检查",(not at the same time)并且第一个 ALWAYS评估为TRUE,而第二个 SEEMS工作.这实际上发生在行值为数字或布尔值的每个地方(Date seems fine...).

如果我走通过代码调试它显示的数值row["PersonID"]162434,一样tbxPersonID.EditValue.这只是我错过的编程的基本和初学真理hodge-podge-self-education吗?

看来,如果我所有问题都string写成第一个,我会很好,我只想知道我是否正确,是否有一般规则Types我需要做什么呢?

不起作用

if (row["PersonID"] != tbxPersonID.EditValue)
{
    row["PersonID"] = tbxPersonID.EditValue;
}
if (row["CitizenFlag"] != chkCitizen.EditValue)
{
    row["CitizenFlag"] = chkCitizen.EditValue;
    _whatChanged.Add("CitizenFlag");
}
Run Code Online (Sandbox Code Playgroud)

作品

 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");
 }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 18

row["PersonID"]是object类型,这意味着!=和==将使用引用标识.基本上你是在比较盒装值.

如果您使用:

if (!object.Equals(row["PersonID"], tbxPersonID.EditValue))
Run Code Online (Sandbox Code Playgroud)

然后你会得到价值平等语义,我怀疑你会好起来的 - 假设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));
    }
}
Run Code Online (Sandbox Code Playgroud)