2010-02-12 92 views
0

我們可以給結構類型的變量分配空值嗎?C#中的可空類型轉換?

struct MyStruct 
{ 
} 

MyStruct var = null; 

這是可能的在C#.net?

如果不是?那麼C#如何允許Nullable < T> struct類型的變量可以分配爲空?

+0

甚至提出7個問題,他還沒有學會如何使用格式化後。 – Shoban 2010-02-12 09:06:02

+0

hello可空是結構類型complier如何接受null爲這種類型?爲什麼不接受相同的結構類型的變量? – dinesh 2010-02-12 09:32:35

回答

0

對主題:

... C#如何允許Nullable < T>變量的結構類型可以分配爲空?

答案其實很簡單:C#編譯器知道Nullable<T>並將其作爲特殊情況處理以維持錯覺。

例如,這樣的:

int? a; 
if (a != null) ... 

實際上編譯成這樣:

if (a.HasValue) ... 

幾乎所有的這個魔法是由編譯器處理 - .NET將主要觀點Nullable<T>只是另一種值類型。我記得閱讀(最有可能從Eric Lippert's blog),在開發過程的後期,他們發現了一個單獨的編譯器技巧無法處理的邊緣問題。運營團隊同意做出一個處理Nullable<T>作爲特例的更改。不幸的是,我不記得什麼特殊情況,我找不到參考了。

請查看這篇文章的詳細信息(尤其是第二個評論這是利珀特): http://blogs.msdn.com/ericlippert/archive/2008/05/07/covariance-and-contravariance-part-twelve-to-infinity-but-not-beyond.aspx

7

是的,這是可能的,但你必須聲明你的變量爲「可空」:

MyStruct? foo = null; 

Nullable<MyStruct> foo = null; 
+0

hello可空是結構類型complier如何爲此類型接受null? 爲什麼不接受相同的結構類型的變量? – dinesh 2010-02-12 09:22:44

+0

@dinesh。事實上,編譯器不能接受null爲非空類型。可空是由它自己的類型。它用一些模擬null行爲的代碼邏輯來修飾內部非空類型;通過提供一些屬性(HasValue,Value)和一些隱式轉換運算符。 – 2010-02-12 09:28:00

0

的Structs不能爲空,Nullable Types用於創建可空結構的情況下, 。

2

在C#中,struct s是值類型,而class es是引用類型。

struct s不能被製作null,所以你必須使用Nullable<T>類將它包裝成可以無效的東西。

這是通過直接使用在聲明中Nullable<T>類完成:

Nullable<MyStruct> foo; 

或者通過使用Nullable<T>的語法糖:

MyStruct? foo; 
+0

hello可空是結構類型complier如何接受null爲這種類型?爲什麼不接受相同的結構類型的變量? – dinesh 2010-02-12 12:59:28