VS2019 Community报CS1519:类成员声明中无效令牌'='如何解决
问题根因
- C#语法明确规定:类、结构体、接口的成员作用域(也就是和类的字段、方法声明平级的位置),仅允许直接写成员声明、特性标注,不能直接写任何可执行语句,包括变量二次赋值、对象方法调用、运算逻辑等。你遇到的CS1519
Invalid token '=' in class, record, struct, or interface member declaration报错,就是因为你把x = 10、keyBindings.add(foo, bar)这类执行语句直接写在了类的根层级,没有包裹在方法、构造函数或其他类成员的代码块内,编译器会把这类代码判定为非法的成员声明,才会提示=是无效标记。 - 你遇到的
keyBindings变量无法识别的问题,和上述报错是同源的:如果调用keyBindings.add的位置在类根作用域,这个位置本身就不允许写执行代码,编译器解析逻辑异常自然会提示变量不存在。另外C#是大小写敏感语言,字典的添加方法是首字母大写的Add,你写的全小写add本身也会触发找不到方法的报错。 - 你提到后续任意文件、任意类中写赋值都会触发同类报错,基本可以确定是最近修改的代码里存在大括号
{}不配对的问题:如果某个命名空间、类、方法的闭合大括号漏写,编译器会错误判定后续所有代码的作用域,哪怕你觉得代码是写在方法里,编译器也可能认为它处于类成员层级,触发全局的语法报错。 - 你贴出的
KeyboardHandler类的现有声明代码本身没有语法错误,问题出在你后续添加调用字典方法的代码的位置,以及可能存在的大括号漏写问题。
修复步骤
- 所有可执行逻辑(包括给变量赋值、调用字典的Add方法、业务判断逻辑)必须放在类的方法、构造函数、属性访问器的代码块内部,不能直接裸露在类的作用域下。如果要初始化按键绑定,推荐把绑定逻辑放在类的构造函数里,参考合法写法:
class KeyboardHandler { // 字段声明+初始化属于合法成员声明,可以直接写在类作用域 Dictionary<_Keys, Actions> keyBindings = new Dictionary<_Keys, Actions>(); // 构造函数,专门放实例初始化相关逻辑 public KeyboardHandler() { // 方法/构造函数内部写执行语句是合法的 keyBindings.Add(_Keys.W, Actions.MoveUp); keyBindings.Add(_Keys.S, Actions.MoveDown); // 类似变量赋值的逻辑写在这里也不会报错 int x; x = 10; } public bool isKeyPressed(_Keys key) { // 普通方法内部同样可以写执行逻辑 return Keyboard.GetState().IsKeyDown((Keys)key); } }
- 修正方法名大小写:调用字典添加方法时使用
Add,不要使用全小写的add。 - 全局排查最近修改的所有代码文件的大括号配对情况:可以借助VS2019自带的括号匹配功能,把光标放在任意大括号上,VS会自动高亮配对的另一个括号,找到漏写的闭合大括号补上,就能解决作用域解析错乱导致的跨文件报错问题。
- 如果排查后发现代码确实写在了方法内部依然报CS1519错误,直接检查这段代码上方的所有大括号配对,90%以上的同类问题都是上方代码块漏写闭合大括号导致的。
内容的提问来源于stack exchange,提问作者Cowzowskin
相关产品推荐
相关产品推荐

