调用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); } } }
另外,你的代码里还有两处语法问题需要修正:
public interface ITest : ICar后面缺少分号,需改为public interface ITest : ICar { }Car.Add(this)后面缺少分号,需改为Car.Add(this);
内容的提问来源于stack exchange,提问作者gbae
相关产品推荐
相关产品推荐

