为什么C#!=运算符通过引用比较值类型?

ris*_*ism 0 c# operators

我有以下代码返回false:

 private static bool AreRowsEqual(string[] fieldNames, DataRow row1, DataRow row2)
        {
            for (var i = 0; i <= fieldNames.Length - 1; i++)
            {
                if (row1[fieldNames[i]] != row2[fieldNames[i]])
                {
                    return false;
                }
            }
            return true;
        }
Run Code Online (Sandbox Code Playgroud)

这是令人惊讶的,因为只有一个long类型的字段被比较,并且每个字段的值根据即时窗口输出匹配:

?row1[fieldNames[i]];
34
?row2[fieldNames[i]];
34

?row1[fieldNames[i]].GetType();
{Name = "Int64" FullName = "System.Int64"}
    [System.RuntimeType]: {Name = "Int64" FullName = "System.Int64"}

? row2[fieldNames[i]].GetType();
{Name = "Int64" FullName = "System.Int64"}
    [System.RuntimeType]: {Name = "Int64" FullName = "System.Int64"}
Run Code Online (Sandbox Code Playgroud)

我在这里忽略了什么?在比较整数值时,我使用!=和=="无处不在".

Mar*_*uth 6

当你这样做时:

(row1[fieldNames[i]] != row2[fieldNames[i]]) 
Run Code Online (Sandbox Code Playgroud)

row[x]给你一个objecthttp://msdn.microsoft.com/en-us/library/146h6tk5.aspx

如果您与对象进行==比较,则比较参考.

你必须转换为他们的原始数据类型或与之比较 obj.Equals(obj2)

例如:

    object a = 2;
    object b = 2;

    if (a == b)
        Debug.WriteLine("== = true");
    if (a.Equals(b))
        Debug.WriteLine("equals = true");
Run Code Online (Sandbox Code Playgroud)

调试输出:
equals = true