'T'必须是可转换的,以便将其用作参数'T'在泛型类型或方法中

本文关键字:参数 方法 泛型类型 可转换 | 更新日期: 2023-09-27 18:14:51

我有这两个主要类。首先是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> ' in以便将其用作泛型类型或方法中的参数' T '' FSMSystem<T> '

谁能告诉我怎么解决这个问题?我看到很多类似的帖子,但我没有看到它们之间的关系。

'T'必须是可转换的,以便将其用作参数'T'在泛型类型或方法中

FSMStateT也必须被约束,否则它不能用作FSMSystemT——T : FSMSystem<T>对它有约束。

如果您提供编译器错误的行号,我怀疑它会指向OnEnter等方法。

这对我帮助很大。谢谢大家。我解决了这个问题。我误解了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);
}