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

时间:2013-05-22 07:25:05

标签: c#

我有这两个主要课程。首先是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>'

有人可以告诉我如何解决这个问题吗?我看到很多其他帖子与此类似,但我没有看到这种关系。

2 个答案:

答案 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);
}