比较对象

时间:2016-11-18 07:50:13

标签: c#

我有两个变量:

object Id = itemType.GetProperty(dataValueField).GetValue(item, null); //=0;

object selectedValue = 0;

想要比较它们。

我试过了:

var a = Id.Equals(selectedValue);
var b = Id == selectedValue;
var c = Object.Equals(Id, selectedValue);
var d = var x = Object.Equals((Object)Id, (Object)selectedValue);

但是一切都是假的;

更新:Id是Int64的类型?和selectedValue是Int32?但==运算符适用于Int64?和Int32?

4 个答案:

答案 0 :(得分:3)

您正在比较实例,这就是为什么它们不同。你必须使用object吗?你能把它投到int吗?

您可以使用自定义类并覆盖Equals()和运算符==。 看看:https://msdn.microsoft.com/en-us/library/ms173147.aspx

我希望它有所帮助。

答案 1 :(得分:2)

我很确定您的数据类型存在问题,而不是值。例如,如果您使用0L(long)和值为0的整数,则检查相等性的所有方法都会返回false。例如,如果两者具有相同的类型(int),则它可以正常工作。

答案 2 :(得分:2)

  

我是Int64的类型吗?和selectedValue是Int32?但==运算符适用于Int64?和Int32?

你说对,这些类型比较正确:

Int64? Id = 0;
Int32? selectedValue = 0;

Console.WriteLine(Id == selectedValue); // indeed true

但是,您的类型为objects,因此您必须记住实际发生的是对象的比较:

object IdAsObject = Id;
object selectedValueAsObject = selectedValue;

Console.WriteLine(IdAsObject.Equals(selectedValueAsObject));
Console.WriteLine(IdAsObject == selectedValueAsObject);
Console.WriteLine(Object.Equals(IdAsObject, selectedValueAsObject));
Console.WriteLine(Object.Equals((Object)IdAsObject, (Object)selectedValueAsObject));

这些都是假的,因为如果它们是同一个对象,则两个对象只相等。

如果要比较这些值,则应确保使用正确的类型。

答案 3 :(得分:1)

查看Int64Int32的源代码。摘录自Int64

http://www.dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/System/Int64@cs/1305376/Int64@cs

    public override bool Equals(Object obj) {
        if (!(obj is Int64)) {
            return false; 
        }
        return m_value == ((Int64)obj).m_value; 
    } 

如果你注意到,Equals做的第一件事是类型检查。这些类型不兼容,您唯一的解决方案是将Int32投射到Int64或编写满足您需要的自定义Equals

并进行一些测试以证明:

public class Blah
{
    public Int32 Id32 { get; set; }
    public Int64 Id64 { get; set; }
}

private void DoTest()
{
    var blah = new Blah
    {
        Id32 = 1,
        Id64 = 1
    };

    object idInt32 = blah.GetType().GetProperty("Id32").GetValue(blah, null);
    object idInt64 = blah.GetType().GetProperty("Id64").GetValue(blah, null);
    object selectedValue = 1; // default type is Int32

    bool areTheSameInt = idInt32.Equals(selectedValue); // true
    bool areTheSameLong = idInt64.Equals(selectedValue); // false
}