7

为什么以下代码不起作用:

endDate.AddDays(7-endDate.DayOfWeek);

虽然这将:

endDate.AddDays(0-endDate.DayOfWeek + 7);

?

(“不起作用”是指导致以下编译错误:“无法从 'System.DayOfWeek' 转换为 'double'”)

4

3 回答 3

12

扩展 Lasse 所说的内容(或者更确切地说,让它更明确一点)。

因为 0 可以转换为 Enum 类型,

0 - endDate.DayOfWeek becomes 
(DayOfWeek)0 - endDate.DayOfWeek

而且由于您可以从另一个枚举中减去一个枚举并获得整数差:

(DayOfWeek)0 - endDate.DayOfWeek == (int)endDate.DayOfWeek

因此,由于减法的结果是一个 int,然后您可以将 7 添加到它。

endDate.AddDays(0-endDate.DayOfWeek + 7);

所以,如果星期一的枚举值为 1

0 - endDate.DayOfWeek == -1 + 7 == 6

但是,您不能反过来。

endDate.DayOfWeek - 0 + 7, 

因为计算的结果类型取决于最左边。因此,虽然 0 - endDate.DayOfWeek 产生一个整数,但 endDate.DayOfWeek - 0 产生一个枚举 DayOfWeek。

最有趣的是,您可以使用这种副作用来获取枚举的值而无需强制转换,尽管我认为这很骇人且令人困惑……因此应该避免。

int enumValue = -(0 - endDate.DayOfWeek);
于 2009-06-04T17:50:59.077 回答
4

这很有趣。正确的做法是:

endDate.AddDays(7 - (int)endDate.DayOfWeek);

但是,您的问题不是关于解决方案,而是行为的原因。它与编译器处理零的方式有关。如果不存在零,则任一行都失败,而如果存在零,则两条行都有效。

于 2009-06-04T17:28:16.630 回答
4

您可以减去两个枚举值以获得它们的整数值差:

using System;

namespace ConsoleApplication10
{
    public enum X { A, B, C, D }
    public class Program
    {
        static void Main()
        {
            var x = X.D + X.A;
            Console.Out.WriteLine(x);
            Console.In.ReadLine();
        }
    }
}

会打印出来 3。

但是你不能添加,可能没有意义。

在“0”的情况下,0 可以自动转换为所有枚举类型,所以基本上“0 - enumvalue”的含义与“(enumtype)0 - enumvalue”相同,这同样适用。

于 2009-06-04T17:43:23.517 回答