Dot-Net

VB.NET:來自“Nothing”的布爾值,有時為“false”,有時為 Nullreference-Exception

  • December 3, 2013

來自*C# 中的基本布爾邏輯*,我想知道為什麼:

Dim b As Boolean
Dim obj As Object = Nothing
'followig evaluates to False'
b = DirectCast(Nothing, Boolean)
'This throws an "Object reference not set to an instance of an object"-Exception'
b = DirectCast(obj, Boolean)

ACType(obj, Boolean)將評估為False(就像CBool(obj)). 我認為這是因為編譯器使用了輔助函式,但這不是我的主題。

為什麼轉換NothingBoolean評估為False,而轉換為的對象會Nothing引發BooleanNullreference-Exception?那有意義嗎?

[Option Strict ON]

據推測,這是因為在 VB.NET 中與在 C# 中Nothing的東西並不完全相同。null

對於值類型,Nothing表示該類型的預設值。在 a 的情況下Boolean,預設值為False,因此轉換成功。

值類型(如 Integer 或結構)與引用類型(如 Form 或 String)之間的主要區別之一是引用類型支持空值。也就是說,引用類型變數可以包含值Nothing,這意味著該變數實際上並不引用一個值。相反,值類型變數總是包含一個值。Integer 變數始終包含一個數字,即使該數字為零。如果將值 Nothing 分配給值類型變數,則值類型變數只會被分配其預設值(在 Integer 的情況下,該預設值為零)。目前的 CLR 無法查看 Integer 變數並確定它是否從未被賦值——它包含零的事實並不一定意味著它沒有被賦值。

    –關於可空類型和 VB 的真相…

編輯:為了進一步說明,第二個範例在執行時拋出 a 的原因NullReferenceException是因為 CLR 試圖將Object(引用類型)拆箱為 a Boolean。當然,這會失敗,因為該對像是使用空引用初始化的(將其設置為Nothing):

Dim obj As Object = Nothing

請記住,正如我上面所解釋的,當涉及到引用類型Nothing時,VB.NET 關鍵字的工作方式仍然與 C# 中的相同。這就解釋了為什麼你得到 a因為你試圖投射的對象實際上是一個空引用。它根本不包含值,因此不能拆箱為類型。null``NullReferenceException``Boolean

當您嘗試將關鍵字轉換為布爾值時,您看不到相同的行為Nothing,即:

Dim b As Boolean = DirectCast(Nothing, Boolean)

因為關鍵字Nothing(這一次,在值類型的情況下)只是意味著“這種類型的預設值”。在 a 的情況下Boolean,就是False,所以演員表是合乎邏輯且直接的。

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