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)
返回falseboolx=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)
返回falseboolx=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也应该是字符串类型。实际上是函数中的对象类型参数,我可以在这个函数中传递任何类型的值,有可能使它成为泛型的吗?可以