簡體   English   中英

一個對象如何同時為null和不為null?

[英]How can an object be null and not null at the same time?

因此,我有這段代碼,如果我在return語句上斷點,則立即窗口將輸出以下信息。

try
{
    await connection.OpenAsync();
    var obj = await cmd.ExecuteScalarAsync();
    return obj != null ? Int32.Parse(obj.ToString()) != 1 : false;
}
catch (Exception ex)
{
    Log.Error("An error has occurred checking a customer/product authorization.", ex);
    return false;
}
finally
{
    connection.Close();
}

存儲過程這是存儲過程的相關部分。 @HasAuthTable和@IsAuthorized的類型為bit

SELECT (CASE WHEN @HasAuthTable = 0 THEN 1 ELSE 0 END) | @IsAuthorized AS IsAuthorized

立即窗口

obj
0

obj == null
false

obj != null
false

obj == 0
error CS0019: Operator '==' cannot be applied to operands of type 'object' and 'int'

obj != 0
error CS0019: Operator '!=' cannot be applied to operands of type 'object' and 'int'

(int)obj == 0
true

(int)obj != 0
false

obj.GetType().FullName
"System.Int32"

obj.Equals(null)
false

!obj.Equals(null)
true

Object.ReferenceEquals(obj, null)
false

!Object.ReferenceEquals(obj, null)
false

我嘗試過重建解決方案沒有任何改變。 我也嘗試過重新啟動Visual Studio。 沒運氣。 這是預期的行為嗎? 好像是個錯誤。

更改存儲過程我嘗試更改存儲過程的輸出以匹配以下內容,以查看它是否以任何方式對其產生影響。 結果基本相同。 具有預期動態類型的object的靜態類型,都具有值,但對於obj == nullobj != null仍返回false

SELECT CAST(((CASE WHEN @HasAuthTable = 0 THEN 1 ELSE 0 END) | @IsAuthorized) AS BIT) AS IsAuthorized

各自的即時窗口

obj
false

obj != null
false

obj == null
false

obj.GetType().FullName
"System.Boolean"

var obj = await cmd.ExecuteScalarAsync(); 在做拳擊

在此處輸入圖片說明

如果將0裝箱,則立即窗口顯示不正確的值。 它必須是“即時窗口”中的錯誤。

在此處輸入圖片說明

圖片來自Daniel Solis的Illustrated C#2012第4版

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM