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
,并且表达式中从不使用字典索引器。也许第二个吸气剂:-)?