c#类内部的元组列表未设置为对象的实例

本文关键字:设置 对象 实例 列表 内部 元组 | 更新日期: 2023-09-27 18:01:52

我试图在自定义类中使用元组列表,该自定义类包装了游戏中多个类的一些方法。就在包装器类的第一个ADD方法在控制台显示"enter ADD METHOD A-1"之后,我得到了一个"对象引用未设置为对象错误实例"。显然,我没有正确设置列表,但我看不出问题在哪里。任何帮助将是感激的,因为我是新的工作与'类'。

// wrappers & classes
KilledActorsWrapper KilledActors = new KilledActorsWrapper();
    public class KilledActorsWrapper
#region KilledActorsWrapper class
{
    public KilledActorsWrapper() 
    {   // constructor
        if (Type.GetType("KilledActorsWrapper") == null)    // check to see if class has been initiated
        {   //class with the given name does not exist so instantiate it
            List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>> m_KilledActors =
                        new List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>>();
            m_KilledActors.Clear();
            ConsoleWriteline("INITIALISED KILLEDACTORS LIST");
        }
        else
        {   // class with the given name exists so show an error, cannot initate the class twice
            ColoredConsoleWrite(ConsoleColor.DarkGreen, "INITIALISING KILLEDACTORS LIST FAILED");
            throw new Exception("KilledActorsWrapper class already exists. Are you typing to initiate a second instance of this class?");
        }
    }
    public void Add(AiActor killedActor, List<DamagerScore> damages)
    {
        ConsoleWriteline("ENTERED ADD METHOD A");
        Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>> tuple = new Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, 
            List<DamagerScore>>(killedActor, null, NamedDamageTypes.AirbrakeDriveFailure, damages);
        ConsoleWriteline("ENTERED ADD METHOD A-1");
        m_KilledActors.Add(tuple);
        ConsoleWriteline("ENTERED ADD METHOD A-2");
    }
    public void Add(AiActor killedActor, AiDamageInitiator initiator, NamedDamageTypes damageType)
    {
        ConsoleWriteline("ENTERED ADD METHOD B");
        Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>> tuple = new Tuple<AiActor, AiDamageInitiator, NamedDamageTypes,
            List<DamagerScore>>(killedActor, initiator, damageType, null);
        ConsoleWriteline("ENTERED ADD METHOD B-1");
        this.m_KilledActors.Add(tuple);
        ConsoleWriteline("ENTERED ADD METHOD B-2");
    }
    public int Count
    {
        get { return m_KilledActors.Count; }
    }
    public List<DamagerScore> GetDamagerScore(AiActor killedActor)
    {
        for (int i = 0; i < m_KilledActors.Count; i++)
        {
            if (m_KilledActors[i].Item1 == killedActor) 
            {
                return (List<DamagerScore>)m_KilledActors[i].Item1;
            }
        }
        return null;
    }
    public List<AiDamageInitiator> GetDamageInitiators(AiActor killedActor)
    {
        List<AiDamageInitiator> damageinitiators = null;
        for (int i = 0; i < m_KilledActors.Count; i++)
        {
            if (m_KilledActors[i].Item1 == killedActor)
            {
                damageinitiators.Add((AiDamageInitiator)m_KilledActors[i].Item2);
            }
        }
        return damageinitiators;
    }
    public List<NamedDamageTypes> GetNamedDamageTypes(AiActor actor)
    {
        List<NamedDamageTypes> nameddamagetypes = null;
        for (int i = 0; i < m_KilledActors.Count; i++)
        {
            if (m_KilledActors[i].Item1 == actor)
            {
                nameddamagetypes.Add((NamedDamageTypes)m_KilledActors[i].Item3);
            }
        }
        return nameddamagetypes;
    }
    public void Clear()
    {
        m_KilledActors.Clear();
    }
    private List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>> m_KilledActors { get; set; }
}
#endregion
public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
#region process when an actor dies
{
    base.OnActorDead(missionNumber, shortName, actor, damages);
    KilledActors.Add(actor, damages); // call the wrapper class
}
public override void  OnActorDamaged(int missionNumber, string shortName, AiActor actor, AiDamageInitiator initiator, NamedDamageTypes damageType)
{
    base.OnActorDamaged(missionNumber, shortName, actor, initiator, damageType);
    KilledActors.Add(actor, initiator, damageType); // call the wrapper class
}

c#类内部的元组列表未设置为对象的实例

m_KilledActors或tuple没有定义。

在这种情况下,错误在构造函数

List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>> m_KilledActors = new List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>>();

这会导致m_killledactors的定义重复。改成

m_KilledActors = new List<Tuple<AiActor, AiDamageInitiator, NamedDamageTypes, List<DamagerScore>>>();