HttpContext.Current.Session不明确的行为布尔值

Mar*_*ero 14 c# asp.net session httpcontext conditional-operator

我有一个奇怪的行为试图获取存储在HttpContext.Current.Session的布尔属性的值.

该对象是一个布尔值.首先,我试图检查对象是否存在,如果存在,则使用它.

我试图在?:运算符中使用它,但它表现得很奇怪.这是我的Watch窗口: 来自VisualStudio的观察者

前提

  • "ExistingKey"键存在并且具有值为false(如果键不存在返回false).

结果

  1. 检查!=null它是否返回false(第一件事很奇怪).
  2. 当使用?:运算符时,除了条件为假之外,它还返回第一个表达式4(第二个奇怪的东西).

有人能解释一下这种行为吗?


注意:我不是要求绕过这种情况的替代方案.只是问为什么这样的工作原理.

Mik*_*keS 2

这似乎是监视窗口中的某种错误。我测试了以下代码:

protected void Page_Load(object sender, EventArgs e)
{
   var  objDict = new Dictionary<string, object>();
    var boolDict = new Dictionary<string, bool>();
    Session["ExistingValue"] = false;
    bool? nullableValue = false;

    Session["ExistingValueNullable"] = nullableValue;
    var existingValue = (bool)Session["ExistingValue"];
    var existingValueIsNotNull = Session["existingValue"] != null;
    objDict["ExistingValue"] = false;
    boolDict["ExistingValue"] = false;
    bool existingValueIsNotNullIf = false;
    if (Session["ExistingValue"] != null)
    {
        existingValueIsNotNullIf = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在监视窗口中看到以下内容:

观察窗

因此您可以看到,在 Session 和 Dictionary<string,object> 的情况下,!= null 的计算结果为 false。Dictionary<string,bool> 可以正确评估此比较。

奇怪的是,'Session["ExistingValue"] != null' 和 'Session["ExistingValue"]' == null' 都是 false。

如果我先将会话值转换为 bool,然后与 null 进行比较,我会得到正确的结果。

最后,如果我在代码中测试值 'Session["ExistingValue"] != null',我会得到正确的结果。这至少让我放心,这是监视窗口中的内容,并且代码中不应该存在类似的问题。

我所有的测试都是在 Visual Studio 2015 中进行的。