Indizierung mit []



  • Guten Tag,
    ich habe eine Klasse Inventar und eine Klasse Item. Die Klasse Inventar hat ein eine Liste, die Objekte von Item aufnimmt.

    //Inventar.cs
    class Inventar
    {
        List<Item> inventar_items;
        public Inventar(IPlayableCharacter CharactersInventar)
        {
            inventar_items = new List<Item>();
        }
        public void AddItemToInventar(string item_name, Item.ItemType type)
        {
            inventar_items.Add(new Item(item_name, type, characters_inventar));
        }
    }
    

    Hier sieht man die Deklaration der Liste und die Definition im Konstruktor. Das ist nun eine sehr kleine Übersicht über die Inventarklasse, soll aber zum Überblick der Liste dienen was eventuell wichtig ist.
    Kommen wir zur Itemklasse.

    //Item.cs
    sealed class Item
    {
        public string ItemName { get; private set; };
        public enum ItemType
        {
            HealthTrank,
            ManaTrank,
            Sword
        }
        public Item(string item_name,Item.ItemType type, IPlayableCharacter CharactersInventar)
        {
            this.ItemName = item_name;
            this.Type = type;
            this.character = CharactersInventar;
        }
        public override string ToString()
        {
            return ItemName;
        }
    }
    

    IPlayableCharakter sollte hier nicht weiter wichtig sein, es dient nur zur Überprüfung, ob der Spieler auch ein Spieler ist und kein NPC oder Monster. Das Interface halt also kein Zugriff oder verändert irgendwas mit Inventar oder Item.

    Benutzen tue ich diese Klassen nun folgt.

    //Programm.cs
    class Programm
    {
        static void ShowItems(Inventar player_inventar)
        {
            foreach(Item j in player_inventar.inventar_items)
            {
                Console.WriteLine(player_inventar.iventar_items[j]);
            }
        }
    
        static void Main()
        {
            Mage magier = new Mage();
            Inventar inventar_character = new Inventar(magier);
            character_inventar.AddItemToInventar("Heiltrank", Item.ItemType.HealthTrank);
            character_inventar.AddItemToInventar("Manatrank", Item.ItemType.ManaTrank);
            ShowItems(character_invetar);
        }
    }
    

    Der Fehler ist in der ShowItems() Methode. Folgende Fehler wird mir dabei ausgegeben:

    Fehler 1:
    Indizierung mit [] kann nicht auf einen Ausdruck vom Typ "Methodengruppe" angewendet werden.

    Fehler 2:
    Die beste Übereinstimmung für die überladene System.Console.WriteLine(bool)-Methode hat einige ungültige Argumente

    Fehler 3;
    1-Argument: kann nicht von "Methodengruppe" in "bool" konvertiert werden.

    Ich wäre über Hilfe erfreut.

    mfg



  • [...]
        public override ToString()
        {
            return ItemName;
        }
    [...]
    

    sollte lieber

    [...]
        public override string ToString()
        {
            return ItemName;
        }
    [...]
    

    heißen



  • Ah haste gut gesehen, aber in meinem Code steht string. Ich hatte es nur eben abgeschrieben gehabt.
    Es muss an der foreach-Schleife liegen.



  • Edit: ...



  • Dann poste mal den korrekten Code.

    //Programm.cs
    class Programm
    {
        static void ShowItems(Inventar player_inventar)
        {
            foreach(Item j in player_inventar.inventar_items)
            {
                Console.WriteLine(player_inventar.iventar_items[j]);
            }
        }
    

    dürfte Aufgrund der Sichtbarkeit von inventar_items schon nicht gehen.



  • Console.WriteLine(player_inventar.iventar_items[j]);

    =>

    Console.WriteLine(j.ToString());



  • Die foreach-Schleife liefert einen IEnumerator auf das Element der Klasse zurück über welche Iteriert wird, da deine Items in einer List<T> liegen, wird also ein IEnumerator von List<T> zurückgegeben.Dieser ist jeweils ein Element deines Items in deiner Liste, also bekommst du generell ein Item-Objekt zurückgegeben.Somit kannst du direkt über j.?? auf die Attribute von Item zugreifen.



  • Funktioniert wunderbar. Danke ! 👍

    static void ShowItems(Inventar player_inventar)
    {
        foreach(Item i in player_inventar.inventar_items)
        {
            Console.WriteLine(i);
        }
    }
    

Anmelden zum Antworten