Autor Beitrag
Meflin
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 10.09.08 22:56 
Moin moin!

Ich mache gerade meine ersten Schritte in .Net und das (endlich) mit Chrome/Oxygene :) Es sei mir verziehn falls das eine dumme Frage ist, aber ich habe wirklich noch nicht allzuviel Ahnung von Generics (und von den ganzen anderen tollen Dingern die Oxygene im Vergleich zu Object Pascal beherrscht auch noch nicht... :( )

Prinzipiell hätte ich gerne folgende Struktur:

ausblenden Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
FooA<T> = public class
public
  Wulu: T;
end;

FooB<T> = public class
public
  Blubb: Array of FooA<T>;
  constructor(const Count: Integer);
end;

constructor FooB<T>(const Count: Integer);
begin
  Blubb := new FooA<T>[Count];
  for i: Integer := Low(Blubb) to High(Blubb) do
    Blubb[i].Wulu := ... 
end;


Ich hoffe es ist einigermaßen verständlich, was ich will. Ich will eine generische Klasse erzeugen, die im Konstruktor wiederum andere generische Klassen vom selben Typ erzeugt. Nur so wie oben dargestellt funktioniert das ganze nicht :( Unterliege ich da einem prinzipiellen Denkfehler?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20327
Erhaltene Danke: 2114

Win 10
C# (VS 2017)
BeitragVerfasst: Mi 10.09.08 23:04 
Hallo und :welcome:!

Das hier verstehe ich nicht so ganz:
Zitat:
Ich will eine generische Klasse erzeugen, die im Konstruktor wiederum andere generische Klassen vom selben Typ erzeugt.

Spontan hätte ich jetzt gedacht, dass soll heißen, dass FooA<T> ein Array mit Elementen FooA<T> enthalten soll :gruebel:

Aber wenn man die Sache mit der Schleife mal rausnimmt (die Wertzuweisung geht ja nur, wenn ich einen Wert vom Typ T habe), kompiliert das zumindest mal :-)

Grüße
Chirstian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Meflin Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 10.09.08 23:15 
user profile iconChristian S. hat folgendes geschrieben:
Spontan hätte ich jetzt gedacht, dass soll heißen, dass FooA<T> ein Array mit Elementen FooA<T> enthalten soll :gruebel:

Hm ja missverständlich ausgedrückt :nut:

Beispiel:
ausblenden Delphi-Prism-Quelltext
1:
Blubb := new FooB<integer>(5);					

Soll eine Instanz von FooB erzeugen, die wiederum 5 Instanzen von FooA erzeugt, in denen T ebenfalls als Integer gehandhabt wird.

Kompilieren tut das ganze auch, nur sobald ich versuche, mit den FooAs zu arbeiten (also z.B. Werte zuzuweisen), endet das in einer
Zitat:
Der generische Typ ... wurde mit der falschen Anzahl von generischen Argumenten in assembly ... verwendet

Fehlermeldung (die aber das Programm nichtmal zum Absturz bringt sondern nur im Debugger sichtbar wird :gruebel:)
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20327
Erhaltene Danke: 2114

Win 10
C# (VS 2017)
BeitragVerfasst: Mi 10.09.08 23:19 
Hm. Das ist komisch. Folgendes tut's bei mir:

ausblenden volle Höhe Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
namespace ConsoleApplication1;

interface

type
  ConsoleApp = class
  public
    class method Main;
  end;

  FooA<T> = public class
  public
    property Wulu: T;
  end;

  FooB<T> = public class
  public
    property Blubb: Array of FooA<T>;
    constructor(const Count: Integer);
  end;

implementation

class method ConsoleApp.Main;
begin
  var f := new FooB<Integer>(5);

  for i : Integer := low(f.Blubb) to high(f.Blubb) do
    f.Blubb[i].Wulu := i;

  for b in f.Blubb do
    Console.WriteLine(b.Wulu);

  Console.ReadLine;
end;

constructor FooB<T>(const Count: Integer);
begin
  Blubb := new FooA<T>[Count];
  for i : Integer := low(Blubb) to high(Blubb) do
    Blubb[i] := new FooA<T>;
end;

end.


//edit: Ich hab alles, was public ist, als property gemacht, aber das sollte keinen Unterschied machen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Meflin Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mi 10.09.08 23:53 
user profile iconChristian S. hat folgendes geschrieben:
//edit: Ich hab alles, was public ist, als property gemacht, aber das sollte keinen Unterschied machen.

Doch, GENAU DAS macht den Unterschied :shock: Ich habe tatsächlich lediglich mein Array zu einer property gemacht, das ganze neu kompiliert, und jetzt läufts :?

Verstehen tu ich das jetzt allerdings nicht :gruebel: Denn was ändert die property an der Anzahl der generischen Parameter?!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20327
Erhaltene Danke: 2114

Win 10
C# (VS 2017)
BeitragVerfasst: Mi 10.09.08 23:55 
Hast Du mal PEVerify über das Assembly laufen lassen? Der Fehler klingt irgendwie fast nach einem Compiler-Bug.

P.S.: Welche Oxy-Version hast Du genau?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Meflin Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 11.09.08 20:34 
user profile iconChristian S. hat folgendes geschrieben:
Hast Du mal PEVerify über das Assembly laufen lassen?

Nein, was würde mir das bringen? Wie gesagt, .Net = absolutes Neuland für mich...

Zitat:
P.S.: Welche Oxy-Version hast Du genau?

3.0.13

Das wär ja super, wenn gleich mein allererstes Oxy-Projekt nen Compiler-Bug offenbaren würde :lol:
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20327
Erhaltene Danke: 2114

Win 10
C# (VS 2017)
BeitragVerfasst: Do 11.09.08 20:41 
user profile iconMeflin hat folgendes geschrieben:
user profile iconChristian S. hat folgendes geschrieben:
Hast Du mal PEVerify über das Assembly laufen lassen?

Nein, was würde mir das bringen? Wie gesagt, .Net = absolutes Neuland für mich...

PEVerify sagt Dir, ob ein Assembly ein gültiges .NET-Assembly ist. Die Fehlermeldung, die Du gepostet hast, hatte ich mal in einer Beta-Version von Oxy, da hat das Assembly auch bei PEVerify nicht bestanden. Wenn es nicht besteht, ist es definitiv ein Bug im Compiler. PEVerify ist Teil des Windows-SDK (bei mir ist Version 6 drauf, ich bin aber nicht sicher, ob's was aktuelleres gibt :gruebel:)

user profile iconMeflin hat folgendes geschrieben:
Das wär ja super, wenn gleich mein allererstes Oxy-Projekt nen Compiler-Bug offenbaren würde :lol:
Ja ;-) Wenn sich das als Fehler rausstellt, kann ich das gerne als Bugreport in der entsprechenden Newsgroup posten (mit Referenz auf diesen Thread).

Die Version scheint zumindest die Neueste zu sein. Komisch, dass ich den Fehler bei mir nicht sehe.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Meflin Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Do 11.09.08 22:58 
Also PEVerify meldet in beiden Fällen keinen Fehler.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Chefentwickler
Beiträge: 20327
Erhaltene Danke: 2114

Win 10
C# (VS 2017)
BeitragVerfasst: Fr 12.09.08 00:53 
Kannst Du mir das Assemnbly mal als Sourcecode zukommen lassen? Zur Not auch als PN?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".