2009-12-18 65 views
2

我有以下幾點:當我知道它不是null時,這是否需要顯式強制轉換?

MyEnum? maybeValue = GetValueOrNull(); 

if (null != maybeValue) 
{ 
    MyEnum value = (MyEnum)maybeValue; 
} 

我想知道的是,如果是明確的(MyEnum)轉換是必要的MyEnum?類型的實例。這似乎是一個簡單的問題,我只是覺得偏執,如果我在if聲明中做了MyEnum value = maybeValue,那麼可能會有一些運行時錯誤。

回答

4

許多答案都指出,使用Value屬性可以避免演員陣容。這是正確,它回答了這個問題:

是明確的(MyEnum)的類型的實例轉換必要的「MyEnum?」 ?

但是,我們還沒有解決的另一個擔憂:

我只是覺得偏執,有可能可能是一些運行時錯誤,如果我只是說,如果聲明中沒有MyEnum值= maybeValue。

那麼,首先,你不能簡單地分配一個可爲空的值給它的基礎類型的變量。你必須做一些明確的轉換。

但是,如果您以您描述的方式進行操作 - 先檢查是否存在價值 - 那麼這是安全的。 (當然,沒有人在調用HasValue和取值之間突變變量,包含空值。)

如果使用ILDASM或其他工具來檢查生成的代碼,您會發現該代碼對其基礎類型的可爲空的值僅作爲對Value屬性的訪問生成;使用轉換運算符或訪問Value屬性是一個實際上沒有任何區別的差異。如果HasValue爲false,則Value屬性訪問器將被拋出。

使用你覺得看起來更好的語法。我個人可能會選擇演員語法的「價值」語法,因爲我認爲如果說「如果它有一個值,給我值」而不是「如果它有一個值,將其轉換爲它的基礎類型」會更好。

+0

感謝您描述測試無效和投射與使用'HasValue' /'值'之間的差異(或缺乏)。 – 2009-12-18 19:33:20

8

可空類型,你可以做

if (maybeValue.HasValue) 
{ 
    MyEnum value = maybeValue.Value; 
} 
+0

偉大的思想家都認爲。 – 2009-12-18 16:06:03

3

我相信,當你定義一個變量可空類型,它增加了一個.HasValue屬性和.Value財產。您應該能夠使用這些來避免任何投射。

你可以重寫這樣

MyEnum? maybeValue = GetValueOrNull(); 

if (maybeValue.HasValue == true) 
{ 
    MyEnum value = maybeValue.Value; 
} 
6

你的代碼由於您使用可空類型,請嘗試使用

if(maybeValue.HasValue) 
{ 
    MyEnum value = maybeValue.Value; // no cast needed! Yay! 
} 
+0

+1作爲心靈讀者投票。 – 2009-12-18 16:07:25

3

另一種辦法是設置您的枚舉有一個默認值(0 )值,然後你就可以做到以下幾點:

MyEnum value = GetValueOrNull().GetValueOrDefault(); 

但是,這將需要e您的代碼知道默認值的含義,並可能與其他枚舉類型的處理方式不同。

+0

+1我以前不知道的一個巧妙的技巧。我將不得不在工作中檢查代碼,看看我們是否可以從中受益。 – 2009-12-18 16:11:16

相關問題