You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用test函数时出现"给定键不在字典中"错误,求问题原因

问题分析:"给定键不在字典中"错误原因及解决办法

你的代码

public interface ICar { }

public static class Car
{
    static Dictionary<Type, HashSet<ICar>> CarDic = new Dictionary<Type, HashSet<ICar>>();

    public static void Add(ICar carVar)
    {
        var baseType = typeof(ICar);

        foreach (var t in carVar.GetType().GetInterfaces())
        {
            if (t != baseType && baseType.IsAssignableFrom(t))      
            {
                CarDic[t].Add(carVar);
            }
        }
    }
}

public interface ITest : ICar { }

public class ITestClass : ITest
{
    public void test()
    {
        Car.Add(this);
    }
}

问题描述

运行test函数时,系统提示"给定键不在字典中"的错误。仅声明了字典,不理解为何会触发该错误,恳请指出问题所在。


错误原因

你只初始化了Dictionary<Type, HashSet<ICar>>的空实例,但字典里一开始没有任何键值对。当ITestClass的test方法调用Car.Add(this)时,代码会遍历ITestClass实现的接口,找到ITest(它继承自ICar且不是ICar本身),随后尝试访问CarDic[t](这里t是ITest类型),但这个键从未被添加到字典中,因此触发了键不存在的异常。

解决办法

在访问字典的键之前,先检查键是否存在;如果不存在,就先创建对应的HashSet<ICar>实例并添加到字典中。修改后的Add方法如下:

public static void Add(ICar carVar)
{
    var baseType = typeof(ICar);

    foreach (var t in carVar.GetType().GetInterfaces())
    {
        if (t != baseType && baseType.IsAssignableFrom(t))      
        {
            // 检查键是否存在,不存在则创建对应的HashSet
            if (!CarDic.ContainsKey(t))
            {
                CarDic[t] = new HashSet<ICar>();
            }
            CarDic[t].Add(carVar);
        }
    }
}

另外,你的代码里还有两处语法问题需要修正:

  1. public interface ITest : ICar后面缺少分号,需改为public interface ITest : ICar { }
  2. Car.Add(this)后面缺少分号,需改为Car.Add(this);

内容的提问来源于stack exchange,提问作者gbae

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:30:53