我有一种奇怪的行为,试图获取存储在HttpContext.Current.Session的布尔属性的值。
该对象是一个布尔值。首先,我试图检查对象是否存在,如果存在,则使用它。
我正在尝试在?:
运算符中使用它,但它表现得很奇怪。这是我的Watch窗口:
"ExistingKey"
密钥存在且值为false(如果是密钥)
不存在返回false)。!=null
时是否返回false(第一件事很奇怪)。?:
运算符时,除了条件为false之外,它还会返回第一个表达式4(第二个奇怪的东西)。有人可以解释这种行为吗?
注意:我不是要求绕过这种情况的替代方案。只是问为什么会这样。
答案 0 :(得分: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;
}
}
我在观察窗口中得到以下信息:
所以你可以看到,在Session和Dictionary&lt; string,object&gt;的情况下!= null的计算结果为false。字典&lt; string,bool&gt;正确评估这种比较。
奇怪的是,'Session [“ExistingValue”]!= null'和'Session [“ExistingValue”]'== null'都是假的。
如果我首先将会话值转换为bool然后比较为null,我得到正确的结果。
最后,如果我在代码中测试值'Session [“ExistingValue”]!= null',我会得到一个合适的结果。这至少让我放心,这是观察窗口中的内容,代码中应该没有类似的问题。
我所有的测试都在Visual Studio 2015中进行。
答案 1 :(得分:0)
目前请不要认为这是一个答案,由于空格和格式限制,以下内容在答案中比在评论中写得容易得多。
我同意对这个问题的评论,第3行与其他行的结果不一致。我能想到的唯一可以解释的是,Visual Studio中的Watch窗口具有过时的数据/具有损坏的状态。我认为执行相同的语句但在代码本身可以证明或反驳这一点。以下代码与您拥有的代码相同,但输出到StringBuilder
。您是否可以执行此操作并发布结果字符串,并告诉我们这与您在Watch窗口中的内容有何不同?
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();