我有这两个主要课程。首先是FSMSystem类:
public class FSMSystem<T> : MonoBehaviour where T : FSMSystem<T>
{
private T m_Owner = default(T);
protected FSMState<T> currentState;
private Dictionary<int, FSMState<T>> m_states;
public FSMSystem(T owner)
{
m_Owner = GameObject.FindObjectOfType(typeof(T)) as T; //owner;
m_states = new Dictionary<int, FSMState<T>>();
}
protected void AddState( FSMState<T> state )
{
m_states.Add( state.GetStateID(), state );
}
}
第二节课,FSMState:
public abstract class FSMState<T>
{
public abstract int GetStateID();
public abstract void OnEnter (FSMSystem<T> fsm, FSMState<T> prevState);
public abstract void OnUpdate (FSMSystem<T> fsm);
public abstract void OnExit (FSMSystem<T> fsm, FSMState<T> nextState);
}
导致以下错误:
错误CS0309:类型“
T
”必须可转换为“FSMSystem<T>
” 为了在泛型类型或方法中将其用作参数“T
” 'FSMSystem<T>
'
有人可以告诉我如何解决这个问题吗?我看到很多其他帖子与此类似,但我没有看到这种关系。
答案 0 :(得分:9)
T
的{{1}}也必须受到约束,否则不能用作FSMState
的{{1}} - 它会对其施加约束(T
})。
如果您提供了编译器错误的行号,我怀疑它会指向方法FSMSystem
等。
答案 1 :(得分:0)
这对我很有帮助。谢谢你们。我解决了这个问题。我误解了'where'语法。
以下是有效的修订版本。
public class FSMSystem<T> : MonoBehaviour where T : FSMSystem<T>
{
private T m_Owner = default(T);
protected FSMState<T> currentState;
private Dictionary<int, FSMState<T>> m_states;
public FSMSystem()
{
m_Owner = this as T;
m_states = new Dictionary<int, FSMState<T>>();
}
protected void AddState( FSMState<T> state )
{
m_states.Add( state.GetStateID(), state );
}
}
public abstract class FSMState<T> where T : FSMSystem<T>
{
public abstract int GetStateID();
public abstract void OnEnter (T fsm, FSMState<T> prevState);
public abstract void OnUpdate (T fsm);
public abstract void OnExit (T fsm, FSMState<T> nextState);
}