2009-12-04 48 views
1

我從this post瞭解到C#中的值類型不是對象。也就是說,它們不從System.Object繼承。C#:可爲空類型(int?)對象?

假設我的邏輯持有到這一點,是可空類型,如int ?,對象。他們是否繼承了Object?

如果是這樣,它們是否受到與其他對象相同的規則和約束,還是有特殊的規則來管理它們的行爲?

就像參考一樣,這個問題來自對空合併操作符的工作的調查。

+0

嘿,你應該閱讀鏈接的問題和答案更難。值類型也是從'System.Object'派生的,只是間接的;否則他們不會有像'object.GetHashCode'和'object.ToString'這樣的方法。 – mquander 2009-12-04 22:54:37

+0

關於'Nullable '的問題到底是什麼?他們有什麼問題? – thecoop 2009-12-04 22:55:38

回答

11

不正確 - 值類型對象,但它們的行爲與引用類型不同 - 它們是按值傳遞的,而不是按引用傳遞。因此,Nullable<T>(這是什麼T?是)是一個結構,所以繼承自System.ValueType和System.Object。在C#編譯器中有Magic,它使得可爲空的類型的行爲與對null和??的引用類型的行爲相同,但它們總是具有按值複製的語義。

+0

謝謝。我很可能誤讀了這些信息(可能是錯誤的)。 – 2009-12-04 22:58:19

+1

值類型*不是*「僅存儲在堆棧而不是堆中的對象」。也許他們*通常*存儲在堆棧中,但並非總是如此,並且這肯定不會區分值類型和ref類型。 – LukeH 2009-12-04 23:43:33

+0

是的,值類型可以是盒裝的,並且可以放在類中(等等ref類實例中的堆),但是這是思考和傳達其行爲方式的最簡單方法。 – thecoop 2009-12-05 00:17:34

1

你問「從System.Object繼承」還是「引用類型」?

值類型從System.Object繼承,但它們不是引用類型。

可爲空的類型也是值類型,所以它們也不是引用類型,但它們繼承自System.Object。

請注意,您作爲程序員可以聲明的內容和系統提供的內容有所不同。

值類型從System.Object繼承,但您不能自己聲明值類型從任何東西下降。

值類型從System.ValueType下降,而System.ValueType又從System.Object下降。

從技術上講,所有值類型都是從System.Object中下降的。

+0

可空類型是structs(根據coop),不能從* anything *繼承。 – RCIX 2009-12-04 23:30:07

+1

技術上他們這樣做。檢查http://stackoverflow.com/questions/1793357/do-value-types-integer-decimal-boolean-etc-inherit-from-object – 2009-12-04 23:55:44

+2

另請參閱http://blogs.msdn。com/ericlippert/archive/2009/08/06/not-everything-derived from-object.aspx – 2009-12-04 23:58:40

0

一切都是對象,值類型只是結構而非類。

+1

實際上,指針類型_aren't_對象 - 請參閱http://blogs.msdn.com/ericlippert/archive/2009/08/06/不,一切-派生從 - object.aspx – thecoop 2009-12-04 23:00:33

相關問題