ContainsKey(字符串键)如何在Dictionary <string,string =“”>?</string,>上抛出KeyNotFoundException

时间:2014-12-19 18:26:15

标签: c# dictionary

调用词典时如何获得KeyNotFoundException

鉴于我正在调用的方法的签名:

IDictionary<string, string> RequestParams { get; }

鉴于我正在打电话:

enter image description here

鉴于我正在返回Dictionary<string, string>,如下所示:

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

我实际上已经检查过它确实会返回一个实例化并填充Dictionary<string, string>

2 个答案:

答案 0 :(得分:7)

注意,不是Dictionary,而是IDictionary。底层实现可以做任何想做的事情,甚至关闭你的计算机。

使用Dictionary时,ContainsKey不会抛出任何异常(除了键空例外)。

你正在使用的IDictionary的具体实现可能会抛出KeyNotFoundException,但这仍然很奇怪 - 虽然,我看到了很多奇怪的东西,所以不要惊慌:! - )

可能的原因:

  • 你的getter通过另一个getter抛出异常 - 使用StackTrace查找原点。
  • 您使用了错误的Dictionary,请确保您拥有名称空间System.Collections.Generic
  • 你可能正在运行旧代码 - 这发生在我身上,非常痛苦。甚至调试符号也可能有用。只是做一些修改:注释掉一些明显的东西,看看它是否有任何影响。如果你注释掉第64行并且你得到KeyNotFoundException,你知道某些事情......不好...... ^ _ ^

答案 1 :(得分:1)

它无法抛出异常。

使用getter查看文件的using语句。你看到了吗?

  using System.Collections.Generic;

或是它:

  using MyAmazingLib.BetterThanMS.Collections;