Dot-Net

為什麼 Nullable<T> 被視為值類型?

  • November 30, 2010

您是否嘗試過使用該Convert.ChangeType()方法將值轉換為Nullable&lt;T&gt;類型?尷尬的是,它會拋出一個InvalidCastException說法“Null 對像不能轉換為值類型”。

嘗試在您的即時視窗上執行它:?System.Convert.ChangeType(null, typeof(int?))

由於一些模糊的原因,Nullables 被認為是值類型。例如,typeof(int?).IsValueType返回true.

對我來說,因為Nullable&lt;T&gt;accept null,它是一個類類型,而不是一個值類型。有誰知道為什麼它會以不同的方式實施?

System.Nullable&lt;T&gt;從技術上講,它是一種結構,因此它是一種值類型(a 的nullNullable&lt;T&gt;與空引用並不完全相同。它是一個布爾標誌,表示缺少值。)但是,它由執行時特殊處理,這使得它是一種尷尬的值類型。首先,它不滿足where T : struct類型約束(它也不滿足where T : class,因為它的價值)。其次,它表現出有趣的拳擊行為。裝箱 aNullable&lt;T&gt;將導致:

  • 參考,如果null值為null.
  • 基礎類型的裝箱值(如果它實際上包含一個值)。也就是說,在語句中:
int? x = 2;
object y = x;

y不是盒裝的Nullable&lt;int&gt;。它只是一個盒裝的int. T您可以將任何類型的裝箱值拆箱Nullable&lt;T&gt;T當然還有 )。轉換對結果的null引用(如您所料)。Nullable&lt;T&gt;``null

執行時的這種特殊處理使可空類型的工作方式更類似於null引用類型中的工作方式。

引用自:https://stackoverflow.com/questions/2031008