为什么以下代码不起作用:
endDate.AddDays(7-endDate.DayOfWeek);
虽然这将:
endDate.AddDays(0-endDate.DayOfWeek + 7);
?
(“不起作用”是指导致以下编译错误:“无法从 'System.DayOfWeek' 转换为 'double'”)
扩展 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);
这很有趣。正确的做法是:
endDate.AddDays(7 - (int)endDate.DayOfWeek);
但是,您的问题不是关于解决方案,而是行为的原因。它与编译器处理零的方式有关。如果不存在零,则任一行都失败,而如果存在零,则两条行都有效。
您可以减去两个枚举值以获得它们的整数值差:
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”相同,这同样适用。