C# ContainsKey(字符串键)如何在字典上抛出KeyNotFoundException<;字符串,字符串>;?
调用字典时,您如何获得C# ContainsKey(字符串键)如何在字典上抛出KeyNotFoundException<;字符串,字符串>;?,c#,dictionary,C#,Dictionary,调用字典时,您如何获得KeyNotFoundException 给定我调用的方法的签名: IDictionary<string, string> RequestParams { get; } IDictionary RequestParams{get;} 考虑到我正在打的电话: 鉴于我将返回一本词典,如下所示: public IDictionary<string, string> RequestParams { get
KeyNotFoundException
给定我调用的方法的签名:
IDictionary<string, string> RequestParams { get; }
IDictionary RequestParams{get;}
考虑到我正在打的电话:
鉴于我将返回一本词典
,如下所示:
public IDictionary<string, string> RequestParams
{
get
{
NameValueCollection nvc = HttpContext.Request.Params;
#region Collect the Request Params
Dictionary<string, string> dict = new Dictionary<string, string>();
nvc.AllKeys.ForEach(s => dict[s] = nvc[s]);
#endregion
#region Collect the Route Data Present in the Url
RouteData.Values.ForEach(pair =>
{
string param = (pair.Value ?? "").ToString();
if (!String.IsNullOrEmpty(param) && Uri.AbsolutePath.Contains(param))
dict[pair.Key] = param;
});
#endregion
return dict;
}
}
公共IDictionary请求参数
{
得到
{
NameValueCollection nvc=HttpContext.Request.Params;
#区域收集请求参数
Dictionary dict=新字典();
nvc.AllKeys.ForEach(s=>dict[s]=nvc[s]);
#端区
#区域收集Url中存在的路由数据
RouteData.Values.ForEach(对=>
{
字符串参数=(pair.Value???).ToString();
如果(!String.IsNullOrEmpty(param)&&Uri.AbsolutePath.Contains(param))
dict[pair.Key]=param;
});
#端区
返回命令;
}
}
实际上,我已经检查过,它确实返回了一个实例化和填充的
字典
注意,不是字典
,而是IDictionary
。底层实现可以做任何它想做的事情,甚至关闭计算机
使用ContainsKey
时,字典不会抛出任何异常(键null异常除外)
您正在使用的IDictionary
的具体实现可能会抛出KeyNotFoundException
,但这仍然很奇怪-尽管我看到了很多更奇怪的事情,所以不要惊慌:-!)
可能的原因:
- 您的getter正在通过另一个getter抛出异常-使用StackTrace查找源
- 您使用了错误的
词典
,请确保您有命名空间System.Collections.Generic
- 您可能正在运行旧代码-这发生在我身上,非常痛苦。甚至调试符号也可以工作。只是做一些修改:注释掉一些明显的东西,看看它是否有任何影响。如果您注释掉第64行,并得到KeyNotFoundException,您就知道有些东西是。。。不好^_^
它不能抛出该异常
使用getter查看文件的using语句。你看到了吗
using System.Collections.Generic;
还是:
using MyAmazingLib.BetterThanMS.Collections;
当您得到异常时,RequestParams
是什么类型的类?此外,您应该将问题编辑为“鉴于我返回的是IDictionary
”@mason,我已经添加了方法实现。托管代码。ContainsKey
没有引发异常,您的属性getter是。这就是为什么您从未在属性获取程序中放入这样令人惊讶的代码。每次调用新对象时构造它都是意外的,特别是在构造它可能失败的情况下——getter不应该抛出异常。请提供异常的堆栈跟踪。@JaniHyytiäinen再次,请发布堆栈跟踪。您尚未重写ContainsKey()
,但您的异常不会从那里产生。您甚至还没有到达该行的ContainsKey()
部分,您被困在RequestParams
的getter中。根据文档,即使是null键行为也不一定可靠。“实现可能因是否允许键为null而有所不同。”
@JeffWard您是否将IDictionary
与字典混为一谈?Chris在谈论Dictionary
实现的ContainsKey
@mason:我期待的是“啊,这不是我正在运行的最新代码”或类似的东西-就getter而言,这也没什么错NameValueCollection
根本不会抛出KeyNotFoundException
,并且表达式中从不使用字典索引器。也许第二个吸气剂:-)?