数学与枚举(例如DayOfWeek)在C#中

nic*_*ten 7 c# enums dayofweek

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

endDate.AddDays(7-endDate.DayOfWeek);
Run Code Online (Sandbox Code Playgroud)

虽然这会:

endDate.AddDays(0-endDate.DayOfWeek + 7);
Run Code Online (Sandbox Code Playgroud)

(通过"不起作用"我的意思是导致以下编译错误:"无法从'System.DayOfWeek'转换为'double'")

Eri*_*sch 12

扩展Lasse所说的内容(或者说更明确一点).

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

0 - endDate.DayOfWeek becomes 
(DayOfWeek)0 - endDate.DayOfWeek
Run Code Online (Sandbox Code Playgroud)

因为你可以从另一个枚举中减去一个枚举并获得整数差异:

(DayOfWeek)0 - endDate.DayOfWeek == (int)endDate.DayOfWeek
Run Code Online (Sandbox Code Playgroud)

因此,由于减法的结果是int,因此可以向其中添加7.

endDate.AddDays(0-endDate.DayOfWeek + 7);
Run Code Online (Sandbox Code Playgroud)

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

0 - endDate.DayOfWeek == -1 + 7 == 6
Run Code Online (Sandbox Code Playgroud)

但是,你不能这样做.

endDate.DayOfWeek - 0 + 7, 
Run Code Online (Sandbox Code Playgroud)

因为计算的结果类型取决于最左侧.因此,当0 - endDate.DayOfWeek产生一个整数时,endDate.DayOfWeek - 0会产生一个枚举DayOfWeek.

最有趣的是,你可以使用这种副作用来获得枚举的值,而不需要施放,但我会考虑这种hackish和混乱...因此要避免.

int enumValue = -(0 - endDate.DayOfWeek);
Run Code Online (Sandbox Code Playgroud)