2016-07-28 40 views
5

所以我有這一點的代碼,如果我在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與預期的動態類型,都有值,但仍返回falseobj == nullobj != null

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" 
+0

可能重複的[DBNull如何不等於DBNull](http://stackoverflow.com/questions/2060217/how-can-dbnull-not-equal-dbnull) – Eris

+0

@Eris如果值是'DBNull。值',那麼'obj'不會解析爲'0','obj!= null'將會是'true'而不是'false'。 – Servy

+0

使用調試器檢查obj的類型。 – Ian

回答

5

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

enter image description here

立即窗口顯示,如果0是盒裝不正確的值。它必須是立即窗口中的錯誤。

enter image description here

圖片是從Illustrated C# 2012 4th Edition by Daniel Solis

+0

即時窗口反映了代碼中發生的事情。所以當它達到'return obj!= null? Int32.Parse(obj.ToString())!= 1:false;''obj!= null'返回false(即使它不爲null)。我知道我在技術上可以在這一點上刪除'obj!= null'檢查,但我很好奇這是一些新的/奇怪的故意行爲還是一個錯誤。 – Shelby115

+2

即時窗口有一個錯誤。如果裝箱值爲0,則結果不匹配。查看返回的更新屏幕截圖。 – Win

+0

我[報告了Roslyn回購站上的即時窗口錯誤](https://github.com/dotnet/roslyn/issues/12846)。 – svick