Object.ReferenceEquals永远不会命中

axi*_*ngs 4 c#

谁能告诉我为什么以下情况不会发生?

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*sik 8

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

你有意这样做吗?价值比较:

if (DateTime.Compare(x, timestamps.First()) == 0)
{
    // Never hit
    Console.WriteLine("hello");
}
Run Code Online (Sandbox Code Playgroud)

  • 不变性是关于一个值是否可以改变,而不是它是如何被复制的,list.First()正在做什么等等.这里复制值的事实并没有说明`DateTime`本身是否是不可变的.你*可以*制作一个可变的值类型,将其中的一小部分填入列表,通过问题中的逻辑传递该列表,并体验相同的失败*因为*你在答案中说的其他所有内容.你同意吗? (2认同)
  • @PaulSasik没有丝毫.字符串是不可变的,可以是引用等号.两个可变值类型,或同一个盒装两次,不能引用等于.不变性与参考身份完全正交. (2认同)

Eri*_*ert 6

传递值类型并按进行比较.这就是为什么他们被称为"价值类型".

参考类型通过引用传递和比较.这就是为什么他们被称为"参考类型".

DateTime是值类型.

因此,您试图通过引用比较两个值.那不行.它总是假的.

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