Mar*_*ero 14 c# asp.net session httpcontext conditional-operator
我有一个奇怪的行为试图获取存储在HttpContext.Current.Session的布尔属性的值.
该对象是一个布尔值.首先,我试图检查对象是否存在,如果存在,则使用它.
我试图在?:运算符中使用它,但它表现得很奇怪.这是我的Watch窗口:

"ExistingKey"键存在并且具有值为false(如果键不存在返回false).!=null它是否返回false(第一件事很奇怪).?:运算符时,除了条件为假之外,它还返回第一个表达式4(第二个奇怪的东西).有人能解释一下这种行为吗?
注意:我不是要求绕过这种情况的替代方案.只是问为什么这样的工作原理.
这似乎是监视窗口中的某种错误。我测试了以下代码:
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 中进行的。
| 归档时间: |
|
| 查看次数: |
784 次 |
| 最近记录: |