2009-05-28 98 views
4

我只是寫了一段代碼來比較一個整數的ID與整數的ID?例如:比較整數和整數?結果是布爾?不是布爾型

Dim id As Integer = 1 
Dim nullId As Integer? = Nothing 
Dim areEqual As Boolean 
areEqual = nullId = id 

當我嘗試編譯代碼我得到一個編譯錯誤:

Option Strict On disallows implicit conversions from 'Boolean?' to 'Boolean'. 

雖然這很簡單,我來解決這個問題,我希望有人也許能夠請解釋編譯器中發生了什麼以發出此警告。

回答

7

這是可空類型的怪癖之一。 NULL(一般而言)表示「不知道」。比較已知未知結果未知(因爲您不知道它們是否相同)。

它與.NET中的可爲空類型相同。比較Integer?Integer的結果爲Boolean?,因爲您可能得到True,False或「不知道」。

3

這是編譯器生成可爲空類型的運算符的方式的一個不幸後果。你可以解決它通過使用下面的代碼:

Dim AreEqual As Boolean = If(nullId, 0) = id 

If這裏對應於C#的null coalesce operator,是一個快捷方式:

Dim AreEqual As Boolean = If(nullId.HasValue, nullId.Value, 0) = id 
0

您正在嘗試的類型(整數)比作可空類型(整數?)。

您需要檢查nullID的實際值,但不要忘記您需要檢查nullId爲空。

0

發生編譯器錯誤是因爲Option Strict On禁止從'Boolean?'進行隱式轉換。到'布爾'。你正試圖分配一個'布爾?' ('Integer?'='Integer')的結果轉換爲'Boolean'。

在語言標準中,隱式轉換通常是禁用的,以避免意外錯誤。添加顯式轉換很容易;找到你在代碼中隱含的轉換,而不知道它可能很難。

可空類型和普通類型足夠不同以避免它們之間的隱式轉換。

+1

我想你錯過了問題的肉,代碼處理整數和整數?,報告的錯誤是布爾? – 2009-05-28 10:59:40

+0

「integer = integer?」導致一個「boolean?」,並且用戶試圖將它分配給一個「布爾」。但是,是的,我錯過了第一個地方的細節:) – 2009-05-28 12:10:16

0

Null的值爲「我不知道值是什麼」,根據定義,其中一個操作數爲null的任何操作都會導致null。例如。 2 = null結果爲null,因此得到的值來自int = int?必須具有空值作爲可能值,而不僅僅是真值和假值。布爾?是具有該組值的類型,因此它是該操作的返回類型。

允許的唯一隱式轉換是那些始終有效的轉換。你可以隱式將一個int轉換爲long。但對int不長(你可以明確地做到這一點),因爲後者可能會導致信息丟失。如果該數字大於int.MaxValue。 在這種情況下,您將嘗試解除導致運行時異常的空值。