对象如何为null而不是同时为null?

时间:2016-07-28 19:31:20

标签: c# visual-studio-2015 c#-6.0

所以我有这段代码,如果我在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 == 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"

1 个答案:

答案 0 :(得分:5)

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

enter image description here

立即窗口显示错误的值,如果装箱为0。 它必须是立即窗口中的错误。

enter image description here

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