2013-08-05 101 views
0

當您聲明具有基本類型uint的枚舉時,可以在您確切知道要轉換的項目時將其轉換爲int 。但是,當您有一個Dictionary並從中檢索其中一個枚舉項目時,您無法執行此演算。在聲明特定枚舉項時聲明枚舉,但在從字典中檢索時不起作用

爲什麼會發生這種情況?

例如:

枚舉:

public enum IncrementScheduleMask 
{ 
    Sunday = 0x01, 
    Monday = 0x02, 
    Tuesday = 0x04, 
    Wednesday = 0x08, 
    Thursday = 0x10, 
    Friday = 0x20, 
    Saturday = 0x40, 
} 

這將工作:

bool Sun = true; 
ulong weeklyMask = 0; 
if (Sun) 
    weeklyMask |= (int)IncrementScheduleMask.Sunday; 

但這不會:

public static List<string> DaysOfTheWeek = new List<string>{ 
    "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 
}; 

public static Dictionary<string, IncrementScheduleMask> DaysOfTheWeekMasks = new Dictionary<string, IncrementScheduleMask>() 
{ 
    { "Sun", IncrementScheduleMask.Sunday }, 
    { "Mon", IncrementScheduleMask.Monday }, 
    { "Tue", IncrementScheduleMask.Tuesday }, 
    { "Wed", IncrementScheduleMask.Wednesday }, 
    { "Thu", IncrementScheduleMask.Thursday }, 
    { "Fri", IncrementScheduleMask.Friday }, 
    { "Sat", IncrementScheduleMask.Saturday } 
}; 

ulong weeklyMask = 0; 
Action<string> _CompileWeekDays = new Action<string>(dayName => 
{ 

     IncrementScheduleMask iMask = DaysOfTheWeekMasks[dayName]; 

     weeklyMask |= (int)iMask; 
}); 
DaysOfTheWeek.ForEach(_CompileWeekDays); 

我已經與其他先行一步解決方案,但我想知道爲什麼一個工作,而不是另一個。如果你不能這樣施放,那麼這兩種方式不應該是相同的嗎?

+0

你永遠不聲明'fullMask'在你的第二個形式......如果你試圖使用'weeklyMask' ,這從來沒有初始化。請給出一個簡短但完整的例子,其中失敗... –

+1

我想他的意思是weeklyMask | =而不是weeklyMask!= – nhrobin

+0

編輯修復錯別字,對不起傢伙。 – willPlachno2012

回答

0

您的枚舉基於int,而不是uint

這兩種情況之間的區別是,在第一個你有不斷轉換。你可以int轉換爲ulong隱式與常量(文字),因爲編譯器可以看到這些值是非負的。

在第二種情況下,您沒有編譯時常量。因此,從int轉換,一個類型,可能是負的,到ulong,非簽名類型,必須是明確的,不隱。

在這兩種情況下,將(int)轉換爲(ulong)是很自然的。


這裏有一個簡單的例子:

// will work: 
const int e = 1; 
ulong weeklyMask = e; // OK from int to ulong, constant 

對戰:

// will not work: 
int e = 1; 
ulong weeklyMask = e; // illegal from int to ulong, needs explicit cast