DateTime.AddDays()不按预期工作

23

我有这个简单的程序:

        DateTime aux = new DateTime(2012, 6, 12, 12, 24, 0);
        DateTime aux2 = new DateTime(2012, 6, 12, 13, 24, 0);
        aux2.AddDays(1);

       Console.WriteLine((aux2 - aux).TotalHours.ToString());

        Console.ReadLine();
我调试了一下,发现aux2.AddDays(1);似乎不起作用,我错过了什么吗? 它应该返回25但实际答案是1。
问题出在哪里?
还有AddHours也不起作用,我猜其他的也不行。

8
DateTime 实例是不可变的。你必须将 .AddDays 的结果赋值给另一个实例(或者当前实例本身)。 - mellamokb
3个回答

65

这确实可以工作,但你没有使用返回值,请尝试:

aux2 = aux2.AddDays(1);

DateTimeString一样具有不可变性。


编辑

MSDN上有一小段关于此的描述:

此方法不会更改该 DateTime 的值。相反,它返回一个新的 DateTime,其值是此操作的结果。


真的是无语了,我以为aux2会自动改变,结果发现这只是一个bug。 - Sas Gabriel
是的,“返回一个新的DateTime字符串...”,鼠标悬停时的工具提示。 - Sas Gabriel
3
请注意,@SasGabriel,在.NET版本2.0及以下的提示工具/文档中,存在误导性的描述。虽然这些文档说明了DateTime.Add()方法会“将指定的天数添加到此实例的值中”,但实际上它的行为方式并没有改变。请确保注意这一点。 - Kuba Wyrostek
当你这样做时,VS会告诉你“不必要的赋值”。显然这是非常必要的,有人应该告诉微软。 - Lucas925
@Lucas925 你在使用这个变量吗? - Jodrell

5

DateTime.AddDays 返回新的 DateTime 对象,它会增加指定的天数。您需要将其赋值给变量:

aux2 = aux2.AddDays(1);

1

你正在使用不可变函数。

DateTime函数是不可变的,一旦你将变量设置为它,它就不能改变,但你可以将新变量设置为该函数的工作结果。AddDay函数接受你输入的变量,但它不会改变原始变量,它仍然是不可变的。因此,你需要设置一个新变量等于原始变量加上一天。

所以,你真正需要做的就是改变

aux2.AddDays(1);

至于

aux2 = aux2.Adddays(1);

然后你的其余比较函数应该就可以工作了。


这种行为与函数的不可变性无关。重要的是类型或者在这种情况下,结构的不可变性。 - Jodrell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接