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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:02:37