当GetType()。Name匹配时,DataGridViewCell类型不匹配?

时间:2016-09-13 19:56:32

标签: c# datagridview equality

当迭代DataGridViewCellDataGridViewRow的集合时,我正在测试特定单元格的相等性,如下所示:

var transactionLogId = dataGridView1.Rows[dataGridView1.SelectedCells[0].RowIndex].Cells[0].Value;
if (dgvRow.Cells[0].Value == transactionLogId) {
    // Snip
}

令我沮丧的是,它从未进入嵌套块。虽然两者都相同(5177518),dgvRow.Cells[0].Value.GetType().NametransactionLogId.GetType().Name都是Int64,但除非我向.ToString()附加.*?([0-9]{3})$ ,否则它不起作用平等检查。

好奇我在这里缺少什么。谢谢!

2 个答案:

答案 0 :(得分:3)

运算符是静态调用,这意味着重载决策将严格基于操作数的编译时类型来解决。

在您的情况下,重载解析正在解决以下运算符重载:

==(object, object)

因为那些是操作数的编译时间类型。对象的==只是执行引用相等性检查,也就是说,如果两个对象都是同一个对象,它们显然不是。

以下代码也是如此:

object o1 = 1;
object o2 = 1;
var equal = o1 == o2; //false

在这种情况下使用Equals是正确的事情,因为它是一个虚拟调用,因此它将解析为被调用者的运行时类型并为您提供正确的结果。

那么为什么在两个操作数上调用ToString()时这会起作用?只是因为重载决策解析为执行值相等的==(string, string)类中实现的string重载。

<强>更新

通过Machine Learning阅读评论,似乎存在关于==在OP代码中返回false的原因的误解。我想澄清拳击与它无关;请考虑以下示例:

var str1 = "a";
var str2 = 'a'.ToString(); //to avoid string interning by the compiler.
var equals = str1 == str2; //true
object o1 = str1;
object o2 = str2;
equals = o1 == o2; //false

观察到的行为完全相同,此处没有发生装箱/拆箱。

答案 1 :(得分:1)

它们都是盒装值,因此==运算符永远不会为真。

GetType无论如何都会返回相应的未装箱实例的类型。

您需要使用Equals。