所以我有这段代码,如果我在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"
答案 0 :(得分:5)
var obj = await cmd.ExecuteScalarAsync();
正在进行拳击。
立即窗口显示错误的值,如果装箱为0。 它必须是立即窗口中的错误。