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

C#中如何从非Main()类访问字典?

解决方法

直接修复报错

你报错的原因很明确:var只能用来声明局部变量(方法内部的变量),类的字段必须指定明确的类型,不能用var。把var替换成具体的Dictionary<string, building>类型就能解决:

// player.cs
public class player
{
    // 替换var为明确的字典类型
    private Dictionary<string, building> OwnedBuildings = buildingDict.InitializeBuildings();

    // 你的玩家操作方法...
}

更合理的设计方案(推荐)

如果想保持Main()控制游戏机制、player类专注玩家逻辑的分工,更推荐通过构造函数注入的方式传递建筑字典,避免player类直接依赖buildingDict的静态方法,代码解耦性更好:

  1. 在Program.cs的Main中初始化字典并传递给Player
// Program.cs
static void Main()
{
    // 由Main控制游戏核心数据的初始化
    var allAvailableBuildings = buildingDict.InitializeBuildings();
    // 把初始化好的建筑字典传给Player的构造函数
    var currentPlayer = new player(allAvailableBuildings);

    // 后续游戏逻辑...
}
  1. 修改Player类接收并使用字典
// player.cs
public class player
{
    private Dictionary<string, building> OwnedBuildings;
    // 保存所有可购买建筑的字典,用于后续购买判断
    private Dictionary<string, building> _allBuildings;

    // 通过构造函数注入外部初始化好的建筑数据
    public player(Dictionary<string, building> allBuildings)
    {
        _allBuildings = allBuildings;
        // 玩家初始没有建筑,初始化空字典
        OwnedBuildings = new Dictionary<string, building>();
    }

    // 示例:玩家购买建筑的方法,专注玩家操作逻辑
    public bool BuyBuilding(string buildingName)
    {
        if (_allBuildings.ContainsKey(buildingName) && !OwnedBuildings.ContainsKey(buildingName))
        {
            OwnedBuildings.Add(buildingName, _allBuildings[buildingName]);
            // 这里可以添加扣钱、播放动画等玩家操作逻辑
            return true;
        }
        return false;
    }
}

补充说明

  • 如果你的OwnedBuildings是玩家已拥有的建筑,初始时应该是空字典而不是直接复制所有建筑字典,上面的示例已经考虑了这一点。
  • 构造函数注入的方式能让player类不依赖buildingDict的具体实现,后续如果要修改建筑初始化逻辑,只需要在Main()里调整,不需要改动player类,更符合代码的可维护性要求。

内容的提问来源于stack exchange,提问作者Rsp8

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:42:28