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() } }; }
注意事项
- 确保
SprintState、WalkingState等子类完全实现了ICharacterBody3DState的所有抽象成员,否则无法实例化这些子类对象。 - 如果
StateInput不是枚举类型,而是自定义类,必须为它正确实现GetHashCode()和Equals()方法,否则字典无法正确识别和区分不同的键。
内容的提问来源于stack exchange,提问作者user63898
相关产品推荐
相关产品推荐

