一个对象如何同时为 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 == null
和 obj != 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 中的错误].
所以我有这段代码,如果我在 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 == null
和 obj != 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 中的错误].