谁能告诉我为什么下面的条件没有发生?
List<DateTime> timestamps = new List<DateTime>();
timestamps.Add(DateTime.Parse("8/5/2011 4:34:43 AM"));
timestamps.Add(DateTime.Parse("8/5/2011 4:35:43 AM"));
foreach(DateTime x in timestamps)
{
if (Object.ReferenceEquals(x, timestamps.First()))
{
// Never hit
Console.WriteLine("hello");
}
}发布于 2011-10-27 03:24:38
因为DateTime是一个值类型,所以是不可变的,所以即使值是相等的,引用也不会相等。
你是想做这样的事情吗?值比较:
if (DateTime.Compare(x, timestamps.First()) == 0)
{
// Never hit
Console.WriteLine("hello");
}发布于 2011-10-27 03:25:49
值类型按值传递和比较。这就是它们被称为“值类型”的原因。
引用类型按引用传递和比较。这就是为什么它们被称为“引用类型”。
DateTime是一个值类型。
因此,您正在尝试通过引用来比较两个值。那是行不通的。它永远都是假的。
你能解释一下为什么你会期待不同的东西吗?
发布于 2011-10-27 03:36:23
我认为其他一些答案遗漏了一些东西。
在object.ReferenceEquals(object,object)的情况下,任何值类型都被“装箱”到对象,并且传递的是这些(新的)对象。请考虑以下几点:
DateTime d1 = DateTime.MinValue;
DateTime d2 = d1;
object ob1 = (object)d1; // boxed!
object ob2 = ob1;
// false - the values in d1 and d2 are BOXED to (new) different objects
object.ReferenceEquals(d1, d2);
// false - same as above, although I am not sure sure if a
// VM implementation could re-use a BOXED object
object.ReferenceEquals(d1, d1);
// true - naturally - BOXED only once at "boxed!" (same object!)
object.ReferenceEquals(ob1, ob2);祝你编码愉快。
相关:Marc在Value Type Vs Reference Type - Object Class C#中的回答,他谈到了一个boxing conversion。
https://stackoverflow.com/questions/7907733
复制相似问题