一个对象如何同时为 null 和不为 null?

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

所以我有这段代码,如果我在 return 语句上打断点,立即 window 会输出以下信息。

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

立即Window

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

各自立即Window

obj
false

obj != null
false

obj == null
false

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

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

Immediate Window 如果 0 被装箱,则显示不正确的值。 这一定是 Immediate Window 中的错误].

图片来自Illustrated C# 2012 4th Edition by Daniel Solis.