HttpContext.Current.Session нечеткое поведение boolean

У меня странное поведение, пытающееся получить значение логического свойства, хранящегося в HttpContext.Current.Session.

Объект является логическим. Сначала я пытаюсь проверить, существует ли объект и, если существует, использовать его.

Я пытаюсь использовать его в операторе ?:, но он ведет себя странно. Вот мое окно: Наблюдатели от VisualStudio

Предпосылка

  • Клавиша "ExistingKey" существует и имеет значение false (если ключ не существует возвращает false).

Результаты

  • При проверке, если !=null он возвращает false (первое, что странно).
  • При использовании оператора ?:, кроме условия false, оно возвращает первое выражение, 4 (второе - странное).

Может ли кто-нибудь объяснить это поведение?


Примечание. Я не прошу альтернативы обходить эту ситуацию. Просто спрашивайте, почему это работает так.

Ответы

Ответ 1

Кажется, что-то вроде ошибки в окне часов. Я проверил следующий код:

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

И в окне просмотра я получил следующее:

Watch Window

Итак, вы можете видеть, что в случае сеанса и словаря < string, object > значение!= null принимает значение false. Словарь < string, bool > правильно оценивает это сравнение.

Странно, 'Session [ "ExistingValue" ]!= null' и 'Session [ "ExistingValue" ]' == null 'являются ложными.

Если сначала передать значение сеанса в bool, а затем сравнить с null, я получаю правильный результат.

Наконец, если я проверю значение "Session [" ExistingValue "]!= null 'в коде, я получаю правильный результат. Что, по крайней мере, успокаивает меня, что это что-то в окне часов, и не должно быть аналогичной проблемы в коде.

Все мои тесты были в Visual Studio 2015.

Ответ 2

Пожалуйста, не считайте это ответом на данный момент, гораздо легче написать ответ, чем в комментарии из-за ограничений пространства и форматирования.

Я согласен с комментариями к вопросу, строка 3 не согласуется с результатами других строк. Единственное, о чем я могу думать, это может объяснить, что окно Watch в Visual Studio имеет устаревшие данные/имеет поврежденное состояние. Я думаю, что выполнение тех же утверждений, но в самом коде, может доказать или опровергнуть это. Следующий код такой же, как и у вас, но выводится на StringBuilder. Не могли бы вы выполнить это и опубликовать результирующую строку и сообщить нам, если это отличается от того, что у вас есть в окне "Часы"?

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();