C# MonoGame中初始化屏幕宽度字段报错问题咨询
解决字段初始化器无法引用非静态成员的问题
别担心,这绝对是C#入门阶段非常常见的问题,完全不是什么低级错误~我来给你拆解一下原因和解决办法:
错误原因
C#里有个明确规则:字段初始化器不能引用类的非静态字段或方法。为什么会这样?因为字段初始化的代码是在类的构造函数执行之前运行的,这时候你的mGraphicsAdapter虽然写了初始化代码,但它作为非静态成员,还没完成实例化的全部流程,编译器为了避免未初始化的风险,就不允许你在这个阶段依赖它的值来初始化另一个字段。
解决方案
这里有几种靠谱的解决方式,你可以根据自己的需求选择:
1. 在构造函数里初始化screenWidth
这是最常规的做法,把字段初始化的逻辑移到类的构造函数中,这时候所有非静态成员都已经完成初始化,就能安全访问了:
private int screenWidth; private GraphicsAdapter mGraphicsAdapter = GraphicsAdapter.DefaultAdapter; public Game1() { // 构造函数里可以放心访问mGraphicsAdapter screenWidth = mGraphicsAdapter.CurrentDisplayMode.Width; }
2. 使用表达式体属性(只读场景)
如果screenWidth不需要被修改,只是用来获取当前屏幕宽度,你可以把它改成一个只读属性,用表达式体的方式定义,这样每次访问它的时候才会去获取mGraphicsAdapter的值,完美避开字段初始化的限制:
private GraphicsAdapter mGraphicsAdapter = GraphicsAdapter.DefaultAdapter; // 用=>定义属性,每次访问时实时计算值 private int screenWidth => mGraphicsAdapter.CurrentDisplayMode.Width;
3. 把mGraphicsAdapter改为静态(谨慎使用)
如果你的mGraphicsAdapter在整个应用里只需要一个实例,也可以把它改成静态字段,这样字段初始化器就能直接引用它了,但这种方式只适合全局唯一的场景,不要随便乱用静态成员,避免不必要的全局状态:
// 改成静态字段 private static GraphicsAdapter mGraphicsAdapter = GraphicsAdapter.DefaultAdapter; // 现在可以直接初始化screenWidth了 private int screenWidth = mGraphicsAdapter.CurrentDisplayMode.Width;
内容的提问来源于stack exchange,提问作者Ruben
相关产品推荐
相关产品推荐

