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
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!
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.
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. 😉
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!
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code