2012-12-20 15 views
6

Desidero completare la classe List con la mia classe personalizzata. Per ora ho qualcosa del genere;Wrapping List.Add() restituisce - Il riferimento all'oggetto non è impostato su un'istanza di un oggetto

public class PriorityListOfNodes 
{ 

    private List<Node>   list_; 
    private IComparer<Node>  sorter_; 

    public List<Node> List_ { 
      get {return list_;} 
      set {list_ = value;} 
    } 

    public PriorityListOfNodes() 
    { 
      sorter_ = new NodeSorter_fValueDescending(); 
    } 

    public Node PopFromEnd() 
    { 
      Node temp = new Node (list_ [list_.Count - 1]); 
      list_.RemoveAt (list_.Count - 1); 
      return temp; 
    } 

    public Node PeekFromEnd() 
    { 
      return list_ [list_.Count - 1]; 
    } 

    public void Add (ref Node toAdd) 
    { 
      Debug.Log (toAdd); 
      list_.Add (toAdd); 
      list_.Sort (sorter_); 
    } 
} 

Quando faccio ora

Node temp = new Node(10,20); //custom constructor 
PriorityListOfNodes l = new PriorityListOfNodes(); 
l.add(temp); 

ottengo un'eccezione di runtime:

riferimento non impostato a un'istanza di un oggetto

Ho anche provato colpo ref ma con lo stesso risultato. Cosa sto facendo di sbagliato qui?

+0

Stile di denominazione molto strano .. di solito i campi privati ​​hanno il prefisso di sottolineatura, o non hanno alcun prefisso –

+0

@lazyberezovsky Ho usato i prefissi usati ma ci vuole più tempo per scrivere (finisci la parola autocomplete). – Patryk

risposta

9

In realtà non è possibile creare un'istanza di List<Node>.

public PriorityListOfNodes() 
    { 
      sorter_ = new NodeSorter_fValueDescending(); 
      list_ = new List<Node>(); 
    } 
+0

Grazie mille per quello! - Provenire da 'C++' non è facile ... – Patryk

1

Per impostazione predefinita, le classi hanno costruttori senza parametri vuote, in modo da avere in modo efficace:

public class PriorityListOfNodes 
{ 
    private List<Node> list_; 
    // ... 

    public PriorityListOfNodes() 
    { 
    } 

    // ... 
} 

Quando in seguito chiama Add vostra lista è dichiarata, ma non inizializzato. Hai bisogno di fare questo ad un certo punto, probabilmente nel costruttore:

public class PriorityListOfNodes 
{ 
    private List<Node> list_; 
    // ... 

    public PriorityListOfNodes() 
    { 
     this.list_ = new List<Node>(); 
     // ... 
    } 

    // ... 
} 

Vedi Using Constructors (C#).

Problemi correlati