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

C#抽象类中静态字典初始化失败(CS0747)求助

解决CS0747:抽象类中静态Dictionary的正确初始化方式

你遇到的CS0747错误,根源是字典初始化的语法不符合C#规则——字典的集合初始化必须明确指定键值对结构,而你当前的写法没有遵循这个要求。

错误写法问题分析

你写的初始化代码:

public static Dictionary<StateInput, ICharacterBody3DState> State = new Dictionary<StateInput, ICharacterBody3DState>()
{
    StateInput.sprint=new StateInput(),
};

这里的StateInput.sprint=new StateInput()既不是字典键值对的[键] = 值格式,也不是{键, 值}格式,编译器无法识别这是字典的初始化项,因此抛出CS0747错误。

正确初始化写法

根据你的场景(WalkingState等子类继承自抽象类ICharacterBody3DState),正确的初始化方式有两种:

方式1:使用索引器语法(C# 6.0及以上支持)

public abstract class ICharacterBody3DState
{
    public static Dictionary<StateInput, ICharacterBody3DState> State = new Dictionary<StateInput, ICharacterBody3DState>()
    {
        // 键:StateInput的枚举/常量值;值:对应状态类的实例
        [StateInput.sprint] = new SprintState(),
        [StateInput.walk] = new WalkingState()
    };
}

方式2:使用键值对大括号语法(兼容所有C#版本)

public abstract class ICharacterBody3DState
{
    public static Dictionary<StateInput, ICharacterBody3DState> State = new Dictionary<StateInput, ICharacterBody3DState>()
    {
        { StateInput.sprint, new SprintState() },
        { StateInput.walk, new WalkingState() }
    };
}

注意事项

  1. 确保SprintState、WalkingState等子类完全实现了ICharacterBody3DState的所有抽象成员,否则无法实例化这些子类对象。
  2. 如果StateInput不是枚举类型,而是自定义类,必须为它正确实现GetHashCode()和Equals()方法,否则字典无法正确识别和区分不同的键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:55:01