比较类型对象的表达式

时间:2009-08-12 20:35:23

标签: c# .net types typechecking

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

如果我浏览 Debug 中的代码,它会将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");
}

作品

 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");
 }

6 个答案:

答案 0 :(得分:18)

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));
    }
}

答案 1 :(得分:2)

什么是EditValue类型或右手值?问题可能是EditValue不是字符串类型(可能是它的子类或其他东西),因此当你在做它时= = = =它做一个内存地址比较而不是字符串的比较因此你得到了错误而不是真的

答案 2 :(得分:1)

我不知道C#,但在某些语言中,对于数值和字符串,相等性的测试是不同的。所以在这里你必须强制进行字符串比较。

这会告诉我们什么吗?

答案 3 :(得分:1)

如果没有调用ToString(),你的代码会测试两个对象上的相等性,而不是两个数字,这就是它无法工作的原因。

使用ToString()明确告知代码,从row[]和EditValue对象中获取值。

答案 4 :(得分:0)

我猜测row []对象的数据类型类似于int(或bool),而chkCitizen.EditValue属于不同的数据类型。所以你可能会比较'1'== 1并且结果是假的。

答案 5 :(得分:0)

“12345”!= 12345