Laden...

Wie kann ich ein Objekt mit einer Konstruktormethode initialisieren?

Erstellt von Polytechnik vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.026 Views
P
Polytechnik Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren
Wie kann ich ein Objekt mit einer Konstruktormethode initialisieren?

Hallo,
wie der Titel schon sagt möchte ich ein Objekt mit einer Konstruktormethode initialisieren. Unter den Eigenschaften der Klasse befinden sich auch Listen, die ich ungern seperat initialisieren möchte.

Das ist die Eigenschaft der Klasse Pflanze:

public List<int> AnbauSaison = new List<int>();

Hätte ich das Objekt Kuerbis, ließe sich die Liste ganz leicht bestücken z.B.:

kuerbis.AnbauSaison.AddRange(new Pflanze[] { 3, 4, 5, 6, 7 });

(die Zahlen stehen für Monate des Jahres in denen das jeweilige Gemüse gepflanzt oder ausgesät werden kann)

Allerdings soll genau das im Konstruktor passieren, der momentan z.B.:

public Pflanze(string _pflanzenname, int _zehrerart)
        {
            Pflanzenname = _pflanzenname;
            Zehrerart = _zehrerart;
        }

enthalten könnte.

Wo das Objekt Kuerbis über

Pflanze kuerbis = new Pflanze ("Kürbis", 3);

initialisiert werden könnte.

Mein Lösungsansatz war :

public Pflanze(string _pflanzenname, int _zehrerart, int[] _anbauSaison)
        {
            Pflanzenname = _pflanzenname;
            Zehrerart = _zehrerart;
            AnbauSaison.AddRange(_anbauSaison);
        }

Allerdings bekomme ich die Fehlermeldung:
"CS1922 Der Typ "Pflanze" kann nicht mit einem Sammlungsinitialisierer initialisiert werden, weil er nicht "System.Collections.IEnumerable" implementiert."
,wenn ich versuche die Werte in { , } in der oben angegebenen Objektinitialisierung als Argument einzugeben.

Leider konnte ich für mich bisweilen keine Schlüsse aus der Fehlermeldung für einen funktionierenden Code ziehen, da bin ich leider zu unerfahren.

Ich hoffe ihr versteht mein Problem und könnte mir Hilfestellung geben!
Vielen Dank

Grüße

Valentin

T
2.224 Beiträge seit 2008
vor 4 Jahren

Wie sieht den der Code aus, der den Fehler erzeugt?
Ansonsten gibt es auch die Möglichkeit, die einzelnen Properties direkt über einen entsprechenden Syntax zu initalisieren, wenn du keinen Konstruktor dafür anlegen willst, was in manchen Fällen auch gewünscht sein kann.

Wirf mal einen Blick auf die Doku zu dem Thema, dann wird dir vermutlich auch die Meldung klar.
Ebenfalls kannst du diese auch mal bei Google einwerfen, dort dürften genug Treffer samt Beispielen folgen!

Doku

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.939 Beiträge seit 2008
vor 4 Jahren

Du hast also folgendes geschrieben


Pflanze kuerbis = new Pflanze ("Kürbis", 3, { 3, 4, 5, 6, 7 });

?

Da geht so direkt nicht, sondern du mußt noch den Array-Typ angeben:


Pflanze kuerbis = new Pflanze ("Kürbis", 3, new int []{ 3, 4, 5, 6, 7 });

Alternativ vorher einer Array-Variable zuweisen (macht Sinn, wenn du mehrmals das gleiche Array verschiedenen Pflanzen als AnbauSaison mitgeben möchtest).

Edit: Sehe gerade, daß


kuerbis.AnbauSaison.AddRange(new Pflanze[] { 3, 4, 5, 6, 7 });

auch falsch ist, denn auch dort muß es ja


kuerbis.AnbauSaison.AddRange(new int[] { 3, 4, 5, 6, 7 });

heißen. 😉

P
Polytechnik Themenstarter:in
2 Beiträge seit 2019
vor 4 Jahren

Wirf mal einen Blick auf die Doku zu dem Thema, dann wird dir vermutlich auch die Meldung klar.
Ebenfalls kannst du diese auch mal bei Google einwerfen, dort dürften genug Treffer samt Beispielen folgen!

Habe ich tatsächlich schon öfter gemacht. Wie gesagt habe ich für mich aus den Beispielen nichts ziehen können. Ich beherrsche weder besonders gut das exzessiv genutzte Vokabular noch kann ich großartige Schlüsse auf mein Problem aus dem dort dargestellten ziehen. Das kommt sicher mit der Erfahrung.

Danke dir Th69!

Daran lag es. Tatsächlich ist der Fehler recht trivial^^ Wie meistens. Ich bin eher davon ausgegangen, dass der Ansatz überhaupt falsch sein muss, ich habe nämlich

new int [] _anbauSaison

in der Konstruktormethode selber ausprobiert, was Visual Studio nicht haben wollte.

Achso, hast du natürlich recht

kuerbis.AnbauSaison.AddRange(new Pflanze[] { 3, 4, 5, 6, 7 });

ist bei einer schnellen Zusammenkopiererei des Beispielcodes entstanden ;D

Ist ja gut, dass Ihr so schnell geantwortet habt. So sind die Probleme ja schnell gelöst.
Also danke nochmal!

16.834 Beiträge seit 2008
vor 4 Jahren

Gewöhn Dir bitte auch - wenn möglich - die übliche Schreibweise in C# an.
[Artikel] C#: Richtlinien für die Namensvergabe
Das erleichtert zum einen, dass anderen Deinen Quellcode einfacher verstehen - wie eben auch dass Du einfach anderen Code und Beispiele verstehst.

"_myName" ist in C# die Schreibweise für Felder; nicht für Variablen oder Parameter.

Deutscher Quellcode führt zwangsläufig zusätzlich immer zu Denglischem Code - was schrecklich ist.