首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Object.ReferenceEquals从未命中

Object.ReferenceEquals从未命中
EN

Stack Overflow用户
提问于 2011-10-27 03:21:16
回答 5查看 516关注 0票数 4

谁能告诉我为什么下面的条件没有发生?

代码语言:javascript
复制
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");
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-10-27 03:24:38

因为DateTime是一个值类型,所以是不可变的,所以即使值是相等的,引用也不会相等。

你是想做这样的事情吗?值比较:

代码语言:javascript
复制
if (DateTime.Compare(x, timestamps.First()) == 0)
{
    // Never hit
    Console.WriteLine("hello");
}
票数 8
EN

Stack Overflow用户

发布于 2011-10-27 03:25:49

值类型按值传递和比较。这就是它们被称为“值类型”的原因。

引用类型按引用传递和比较。这就是为什么它们被称为“引用类型”。

DateTime是一个值类型。

因此,您正在尝试通过引用来比较两个值。那是行不通的。它永远都是假的。

你能解释一下为什么你会期待不同的东西吗?

票数 6
EN

Stack Overflow用户

发布于 2011-10-27 03:36:23

我认为其他一些答案遗漏了一些东西。

object.ReferenceEquals(object,object)的情况下,任何值类型都被“装箱”到对象,并且传递的是这些(新的)对象。请考虑以下几点:

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7907733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档