C#: Objecten in een Array worden niet herkend.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
Ik zit met een probleempje bij het omzetten van wat code van VB.net naar C#.
Ik heb nu het volgende stukje code:

code:
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
 public static void test(AbstractParticle objA, AbstractParticle objB)
        {
            if (objA.getFixed() && objB.getFixed())
            {
                return;
                return;
            }
            //// rectangle to rectangle
            if (objA is RectangleParticle & objB is RectangleParticle)
            {
               
               [u]testOBBvsOBB(objA, objB);[/u];
                //// circle to circle
            }
            else if (objA is CircleParticle & objB is CircleParticle)
            {
               [u]testCirclevsCircle(objA, objB);[/u];
                //// rectangle to circle - two ways
            }
            else if (objA is RectangleParticle & objB is CircleParticle)
            {
               [u]testOBBvsCircle(objA, objB)[/u]);
            }
            else if (objA is CircleParticle & objB is RectangleParticle)
            {
               [u]testOBBvsCircle(objB, objA);[/u];
            }
            //testOBBvsOBB(DirectCast(objA, RectangleParticle), DirectCast(objB, RectangleParticle))
        }


Ik krijg hier nu bij de vet onderdrukte code de volgende errors:
The best overloaded method match for '....' has some invalid arguments.

Dit komt doordat objA en objB van de klasse AbstractParticle zijn en de verschillende testmethodes (testOBBvsCircle etc) die je ziet een object van het type CircleParticle of RectangleParticle verwachten. Deze twee klassen CircleParticle en RectangleParticle erven de klasse AbstractParticle over dus eigenlijk zou de compiler moeten herkennen dat dit geen problemen zou moeten opleveren. Echter in C# is dit niet het geval terwijl het in VB.net gewoon allemaal goed werkte.

Heeft iemand een idee hoe ik dit weer goed werkend krijg. Dien ik het type object expliciet te vermelden? En waarom is er wat dit betreft een verschil tussen Vb.net en C#?

Ik hoop dat het probleem zo duidelijk is.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14-10 00:53
Je zult in dat geval eerst moeten downcasten naar het concrete type, wat eigenlijk niet echt wenselijk is: het kan een indicatie zijn dat je ontwerp niet helemaal ideaal is.

Probeer de specifieke circle/rectange code naar de Circe/Rectangle klassen te halen en het algoritme (wat in de test methode zit ) algemeen te houden.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
farlane schreef op vrijdag 10 april 2015 @ 21:36:
Je zult in dat geval eerst moeten downcasten naar het concrete type, wat eigenlijk niet echt wenselijk is: het kan een indicatie zijn dat je ontwerp niet helemaal ideaal is.

Probeer de specifieke circle/rectange code naar de Circe/Rectangle klassen te halen en het algoritme (wat in de test methode zit ) algemeen te houden.
Ok thnx. Ik heb het nu als volgt opgelost:

code:
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
 public static void test(AbstractParticle objA, AbstractParticle objB)
        {
            if (objA.getFixed() && objB.getFixed())
            {
                return;
                return;
            }
            //// rectangle to rectangle
            if (objA is RectangleParticle & objB is RectangleParticle)
            {
               RectangleParticle objArect = (RectangleParticle)objA;
               RectangleParticle objBrect = (RectangleParticle)objB;

                testOBBvsOBB(objArect, objBrect);
                //// circle to circle
            }
            else if (objA is CircleParticle & objB is CircleParticle)
            {
                CircleParticle objAcir = (CircleParticle)objA;
                CircleParticle objBcir = (CircleParticle)objB;

                testCirclevsCircle(objAcir, objBcir);
                //// rectangle to circle - two ways
            }
            else if (objA is RectangleParticle & objB is CircleParticle)
            {

                RectangleParticle objArect = (RectangleParticle)objA;
                CircleParticle objBcir = (CircleParticle)objB;

                testOBBvsCircle(objArect, objBcir);
            }
            else if (objA is CircleParticle & objB is RectangleParticle)
            {

                CircleParticle objAcir = (CircleParticle)objA;
                RectangleParticle objBrect = (RectangleParticle)objB;

                testOBBvsCircle(objBrect, objAcir);
            }
            //testOBBvsOBB(DirectCast(objA, RectangleParticle), DirectCast(objB, RectangleParticle))
        }


Het zooitje compileert nu weer maar of dit straks bug vrij gaat werken valt nog te bezien.
Maar goed in ieder geval bedankt voor het zetje in de rug. Precies het zetje dat ik even nodig had.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 14-10 00:53
Mja, behalve dan dat dit nu eigenlijk niet de richting is die je op moet gaan. Dat ligt niet aan C# overigens, de originele code ruikt al enigzins.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.