C# 比较对象与对象

C# 比较对象与对象,c#,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 = Obje

我有两个变量:

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的类型吗?选择的值是Int32?但是==运算符对Int64有效吗?和Int32?

我很确定您的数据类型有问题,而不是值有问题。例如,如果取
0L
(long)和一个值为0的整数,则所有检查相等的方法都返回
false
。例如,如果两者都有相同的类型(
int
),那么它就可以工作。

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

您正在比较实例,这就是它们不同的原因。是否必须使用
对象
?你能把它转换成
int

您可以使用自定义类并重写
Equals()
和运算符
=
。 看看:


我希望这能有所帮助。

您正在比较实例,这就是它们不同的原因。是否必须使用
对象
?你能把它转换成
int

您可以使用自定义类并重写
Equals()
和运算符
=
。 看看:

我希望有帮助


Id是Int64的类型吗?选择的值是Int32?但是==运算符对Int64有效吗?那么Int32呢

正确比较这些类型是正确的:

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

Console.WriteLine(Id == selectedValue); // indeed true
但是,您的类型是
对象
,因此您必须记住,实际发生的是对象的比较:

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));
这些都是错误的,因为只有当两个物体是同一个物体时,它们才是相等的

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


Id是Int64的类型吗?选择的值是Int32?但是==运算符对Int64有效吗?那么Int32呢

正确比较这些类型是正确的:

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

Console.WriteLine(Id == selectedValue); // indeed true
但是,您的类型是
对象
,因此您必须记住,实际发生的是对象的比较:

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));
这些都是错误的,因为只有当两个物体是同一个物体时,它们才是相等的


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

请查看
Int64
Int32
的源代码。摘自
Int64

如果您注意到,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
}

查看
Int64
Int32
的源代码。摘自
Int64

如果您注意到,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
}


数据值字段的类型是什么?你能粘贴
itemType
和你的
item
的类吗?为什么不将Id值转换为int,然后进行比较呢?
dataValueField
的类型是什么?你能粘贴
itemType
和你的
item
的类吗?为什么不将Id值转换为int,然后进行比较?Id是typeof Int64?选择的值是Int32?但是==运算符对Int64有效吗?Int32呢?不,不是这样
boolx=object.Equals((object)0,(object)0L)
返回false
boolx=object.Equals((object)0,(object)0)
返回true。是,同意。但我说的是==运算符,不是Object.Equals()。==运算符在Int64中工作正常吗?和Int32?如果它们都是以正确的方式键入的。现在比较的是对象,而不是基本类型。比较的背后有更多的逻辑,而不仅仅是值。是的,事实上,我的问题是==和Object.Equals()对我不起作用。如果我将这些对象类型强制转换为Int64?那么Int32呢?它会起作用的。但是Id和selectedValue是函数的对象类型参数,我可以传递函数中的任何类型的值Id是typeof Int64?选择的值是Int32?但是==运算符对Int64有效吗?Int32呢?不,不是这样
boolx=object.Equals((object)0,(object)0L)
返回false
boolx=object.Equals((object)0,(object)0)
返回true。是,同意。但我说的是==运算符,不是Object.Equals()。==运算符在Int64中工作正常吗?和Int32?如果它们都是以正确的方式键入的。现在比较的是对象,而不是基本类型。比较的背后有更多的逻辑,而不仅仅是值。是的,事实上,我的问题是==和Object.Equals()对我不起作用。如果我将这些对象类型强制转换为Int64?那么Int32呢?它会起作用的。但Id和selectedValue是函数的对象类型参数,我可以在此函数中传递任何类型的值是的,同意。但是Id和selectedValue也应该是字符串类型。实际上是函数中的对象类型参数,我可以在这个函数中传递任何类型的值,有可能使它成为泛型的吗?()可以这样写:
intid=itemType.GetProperty(dataValueField.GetValue)(item,null)
Generic函数是个不错的主意,但是GetValue()不是泛型函数,我无法编写
int Id=itemType.GetProperty(dataValueField).GetValue(item,null)您可以编写一个通用包装器方法来为您进行转换。但如果不深入了解代码,就很难得出结论。我希望我能帮点忙:)是的,我同意。但是Id和selectedValue也应该是字符串类型。实际上是函数中的对象类型参数,我可以在这个函数中传递任何类型的值,有可能使它成为泛型的吗?可以