枚舉(例如星期幾)爲什麼是它下面的代碼將無法正常工作:數學與C#
endDate.AddDays(7-endDate.DayOfWeek);
雖然這樣:
endDate.AddDays(0-endDate.DayOfWeek + 7);
?
(通過「行不通」我的意思是在下面的編譯錯誤結果:「無法從‘System.DayOfWeek’轉換爲‘雙’」)
枚舉(例如星期幾)爲什麼是它下面的代碼將無法正常工作:數學與C#
endDate.AddDays(7-endDate.DayOfWeek);
雖然這樣:
endDate.AddDays(0-endDate.DayOfWeek + 7);
?
(通過「行不通」我的意思是在下面的編譯錯誤結果:「無法從‘System.DayOfWeek’轉換爲‘雙’」)
爲了擴大Lasse所說的(或者更確切一些)。
因爲0是可轉換到一個枚舉類型,
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。
最有趣的是,你可以使用這種副作用來獲得一個枚舉值,而不需要投射,但我會認爲這個hackish和混亂......因此要避免。
int enumValue = -(0 - endDate.DayOfWeek);
這是非常有趣的。正確的做法是:
endDate.AddDays(7 - (int)endDate.DayOfWeek);
但是,您的問題不是解決方案,而是行爲的原因。它與編譯器處理零的方式有關。如果不存在零,則任何一條線失敗,而如果存在零,則兩條線都工作。
此外,endDate.AddDays(DayOfWeek.Sunday - e.DayOfWeek)確實有效。它將零轉換爲DayOfWeek的星期日場。現在真正奇怪的是「零技巧」失敗了。含義endDate.AddDays(DayOfWeek.Sunday + e.DayOfWeek)不會編譯。 – 2009-06-04 17:35:21
您可以減去兩個枚舉值以得到他們的整數值差異:
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」意思相同,這同樣適用。
對於涉及該功能的編譯器錯誤的一些有趣的分析,請參見: http://blogs.gotdotnet.com/ericlippert/archive/2006/03/28/the-root-of-all-evil -第一部分。aspx and http://blogs.gotdotnet.com/ericlippert/archive/2006/03/29/the-root-of-all-evil-part-two.aspx – 2009-06-04 20:07:10
對於任何尋找Eric的博客文章的人,他們已轉移到http://blogs.msdn.com/b/ericlippert/archive/2006/03/28/the-root-of-all-evil-part-one.aspx和http://博客。 msdn.com/b/ericlippert/archive/2006/03/29/the-root-of-all-evil-part-two.aspx – 2011-07-30 09:25:28