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

HttpContext.Current.Session unclear behaviour boolean

我在尝试获取存储在 HttpContext.Current.Session 的布尔值 属性 的值时遇到了一个奇怪的行为。

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

我试图在 ?: 运算符中使用它,但它的行为很奇怪。这是我的手表 window:

前提

结果

  1. 当检查 !=null 是否 returns 错误时(第一件事很奇怪)。
  2. 当使用?:运算符时,除了条件为假外,它returns第一个表达式,4(第二个很奇怪)。

有人可以解释这种行为吗?


注意:我并不是在寻求绕过这种情况的替代方法。只是问为什么会这样。

目前请不要将此视为答案,由于 space 和格式限制,以下内容写在答案中比写在评论中容易得多。

我同意问题的评论,第3行与其他行的结果不一致。我能想到的唯一可以解释的是 Visual Studio 中的 Watch window 数据陈旧/状态损坏。我认为执行相同的语句但在代码本身中可以证明或反驳这一点。以下代码与您的代码相同,但输出到 StringBuilder。您能否执行此操作并 post 结果字符串,并让我们知道这是否与您手表 window 中的内容有任何不同?

var session = HttpContext.Current.Session;
var builder = new System.Text.StringBuilder();

builder.AppendFormat("session[\"someKeyThatDoesNotExist\"] => value {0}", session["someKeyThatDoesNotExist"] ?? "null").AppendLine();
builder.AppendFormat("session[\"ExistingKey\"] => value {0}", session["ExistingKey"] ?? "null").AppendLine();
builder.AppendFormat("session[\"ExistingKey\"] != null => value {0}", session["ExistingKey"] != null).AppendLine();
builder.AppendFormat("session[\"ExistingKey\"] != null ? 4 : 5 => value {0}", session["ExistingKey"] != null ? 4 : 5).AppendLine();
builder.AppendFormat("session[\"ExistingKey\"] == null ? 4 : 5 => value {0}", session["ExistingKey"] == null ? 4 : 5).AppendLine();

var totalDebugInfo = builder.ToString();

这似乎是手表中的某种错误 window。我测试了以下代码:

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;
    }
}

我在手表中得到了以下内容 window:

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

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

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

最后,如果我在代码中测试值 'Session["ExistingValue"] != null',我会得到一个正确的结果。这至少让我放心,这是手表中的东西 window,代码中不应该有类似的问题。

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