Visual Studio/Xamarin C# 类级Dictionary无法识别IDE1007报错
报错原因
C#语法规定,类的成员声明区域(即类的大括号内、方法/构造函数/属性等成员块外的位置)只能写成员声明、初始化赋值类内容,不能直接写Add这类需要执行的逻辑语句。你把exerciseTypes.Add("Warmup",false);直接裸写在类成员定义区,编译器找不到合法的执行上下文,就会抛出IDE1007系列的“当前上下文不存在对应名称”错误。
修复方案
要求Dictionary归属于类本身、不属于实例,只要保证成员用static修饰,把初始化逻辑放到合法的执行位置即可,有两种常用实现:
方案1:静态构造函数初始化(推荐,适合后续需要动态追加键值对的场景)
静态构造函数归属于类本身,只会在类第一次被加载访问时执行一次,所有实例共享执行结果,完全满足类级成员的要求,修改后完整代码如下:
using System; using System.Collections.Generic; using System.Text; namespace Trainer_App { internal class Exercise { public static Dictionary<string, bool> exerciseTypes = new Dictionary<string, bool>(); private string name; private int min_num_balls; private int[] num_participants; private string court_type; private string[] accessories; private static int id = 0; // 静态构造函数:和实例无关,类加载时仅执行一次 static Exercise() { exerciseTypes.Add("Warmup", false); // 后续需要新增默认运动类型,直接在这里追加Add逻辑即可 } public Exercise() { } } }
方案2:声明时直接用集合初始化器赋值(适合初始键值对固定的场景)
如果初始键值是固定不变的,可以直接在静态字段声明的时候用集合初始化语法填充内容,不需要单独写Add调用,代码更简洁:
using System; using System.Collections.Generic; using System.Text; namespace Trainer_App { internal class Exercise { public static Dictionary<string, bool> exerciseTypes = new Dictionary<string, bool>() { {"Warmup", false} // 其他固定键值对直接按这个格式追加即可 }; private string name; private int min_num_balls; private int[] num_participants; private string court_type; private string[] accessories; private static int id = 0; public Exercise() { } } }
注意事项
- 两种方案实现的
exerciseTypes都是类级静态成员,所有Exercise类的实例共享同一个Dictionary对象,不会随实例创建生成新的副本,完全符合需求。 - 不要把Add初始化逻辑写到普通实例构造函数里,否则每次
new Exercise()都会重复执行Add,第二次创建实例时就会抛出“键已存在”的运行时异常,也违背了类级成员和实例解耦的设计要求。
内容的提问来源于stack exchange,提问作者Gael Pinto
相关产品推荐
相关产品推荐

