所以我有這一點的代碼,如果我在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
與預期的動態類型,都有值,但仍返回false
爲obj == null
和obj != 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"
可能重複的[DBNull如何不等於DBNull](http://stackoverflow.com/questions/2060217/how-can-dbnull-not-equal-dbnull) – Eris
@Eris如果值是'DBNull。值',那麼'obj'不會解析爲'0','obj!= null'將會是'true'而不是'false'。 – Servy
使用調試器檢查obj的類型。 – Ian