2009-06-04 59 views
7

枚舉(例如星期幾)爲什麼是它下面的代碼將無法正常工作:數學與C#

endDate.AddDays(7-endDate.DayOfWeek); 

雖然這樣:

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

(通過「行不通」我的意思是在下面的編譯錯誤結果:「無法從‘System.DayOfWeek’轉換爲‘雙’」)

+2

對於涉及該功能的編譯器錯誤的一些有趣的分析,請參見: 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

+1

對於任何尋找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

回答

12

爲了擴大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); 
4

這是非常有趣的。正確的做法是:

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

但是,您的問題不是解決方案,而是行爲的原因。它與編譯器處理零的方式有關。如果不存在零,則任何一條線失敗,而如果存在零,則兩條線都工作。

+0

此外,endDate.AddDays(DayOfWeek.Sunday - e.DayOfWeek)確實有效。它將零轉換爲DayOfWeek的星期日場。現在真正奇怪的是「零技巧」失敗了。含義endDate.AddDays(DayOfWeek.Sunday + e.DayOfWeek)不會編譯。 – 2009-06-04 17:35:21

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」意思相同,這同樣適用。