Archief - C# System.Object vraagje

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

SideShow

Legacy Member
Hallo

Ziehier volgende simpele code (ik betwijfel als dit veel voorkomt irl, maar bon)

object a = 3;
Console.WriteLine(a.GetType()); //System.Int32
a = new MijnClass();
Console.WriteLine(a.GetType()); //MijnClass
a.x = 1; //genereert error
((MijnClass)a).x = 1; //correct

class MijnClass
{
public int x;
}

Kan mij iemand de error uitleggen? Waarom ben je expliciet verplicht te casten als hij blijkbaar toch weet welk soort object het is?

forloRn_

Legacy Member
Omdat er een verschil is tussen je type @ compile time (Object) en je type @ runtime (MijnClass). Je declareert a als Object dus je compiler zal enkel toelaten dat je het behandelt als een Object. @ runtime treedt er polymorfisme op zodat je wel het echte type terugkrijgt van GetType().

SideShow

Legacy Member
Ok, bedankt, lijkt me duidelijk, alleen kan ik me er niks bij voorstellen, een situatie waarom je dit zou willen gebruiken

Dit is mn testje nu:

Code:
using System;

class MijnApplicatie
{
    static void Main()
    {
        object a = 3;
        Console.WriteLine(a.GetType()); // System.Int32

        a = new MijnClass();
        Console.WriteLine(a.GetType()); // MijnClass

        //a.x = 1; // error
        ((MijnClass) a).x = 1; // correct
        (a as MijnClass).x = 1; // correct
    }
}

class MijnClass
{
    public int x;
}

Ik trachtte nog (a as a.GetType()).x = 1;
maar dit lukt niet

Krueger

Legacy Member
Kan je misschien anders uitleggen waar je naar toe wil gaan, of wat je wil bereiken?
De voorbeelden die je geeft zijn voor mij logisch waarom ze al dan niet werken.
Als je het framework 4.0 gebruikt, kan je anders eens kijken naar dynamics, die laat wel toe wat jij probeert.

Maar toch, leg eens uit wat je wil, misschien ben je verkeerd bezig, en kan het eenvoudiger.
Edit: een poging om te tonen waarom hetgene wat jij wil niet kan werken voor de compiler.

using System;
Code:
class MijnApplicatie
{
    static void Main()
    {
        object a = 3;
        
        if(DateTime.Now.Seconds > 30)
             a = new MijnClass1();
        else
             a = new MijnClass2();

         a.x = 1;
    }
}

class MijnClass1
{
    public int x;
}
class MijnClass2
{
    public int y;
}

moet de compiler nu " a.x = 1; " volgens jou aanvaarden of niet?

NeverwinterX

Legacy Member
SideShow zei:
Ok, bedankt, lijkt me duidelijk, alleen kan ik me er niks bij voorstellen, een situatie waarom je dit zou willen gebruiken

Het is niet mogelijk om een compiler te schrijven die altijd het type kan afleiden. Je kan dat wel voor enkele concrete simpele gevallen zoals deze, maar men kiest ervoor om dat niet te doen. Enerzijds consistentie (ofwel werkt het altijd, ofwel niet) en anderzijds om dat het ook niet zoveel nut heeft: typeer het gewoon van in het begin tegoei of cast het als het niet anders kan.

SideShow

Legacy Member
@krueger

ok, maar je zou kunnen denken dat het in 50% van de gevallen werkt, maar blijkbaar heeft men gewoon beslist om dit niet toe te laten als ik hierboven kijk

Nog iemand een idee waarom (a as a.GetType()).x = 1; niet werkt ? Waarschijnlijk omdat dit ook niet gekend is at compile time dan ?

Krueger

Legacy Member
SideShow zei:
@krueger

ok, maar je zou kunnen denken dat het in 50% van de gevallen werkt, maar blijkbaar heeft men gewoon beslist om dit niet toe te laten als ik hierboven kijk

Nog iemand een idee waarom (a as a.GetType()).x = 1; niet werkt ? Waarschijnlijk omdat dit ook niet gekend is at compile time dan ?

Voor het eerste, een compiler kan niet 50% werken hé :) Ofwel geeft hij een fout als je compilet, ofwel aanvaardt hij het. Het wordt dus nooit aanvaard, maar dat heb je nu dus al door.

Voor het tweede heb je inderdaad gelijkt, het moet een type zijn dat vaststaat @ compile time.

Moto

Legacy Member
alleen kan ik me er niks bij voorstellen, een situatie waarom je dit zou willen gebruiken
Paar voorbeelden

- bij events -> (object sender, EventArgs e) -> casten van sender
- override Equals -> public override bool Equals(object obj)
- Upcasten van objects bv bij werken met interfaces

- algemene kloterij :)

Code:
//Check names parent bars
popupMenu.ParentBarItem.Items.OfType<ParentBarItem>()
               .Where(pbi => pbi.Tag != null && pbi.Tag.GetType() == typeof(Func<string>))
               .Foreach(pbi => pbi.Text = ((Func<string>)pbi.Tag).Invoke());

Krueger

Legacy Member
Serieus, kan je het nu echt niet laten om er altijd een stukje link in te steken, om 'stoer' te doen. Hij zegt zelf dat hij bezig is met een cursus te volgen, en uit zijn vragen zou je wel mogen afleiden dat hij dat laatste nooit zal snappen.
Geef dan toch eenvoudigere voorbeeldenwaar hij WEL iets aan heeft.

Moto

Legacy Member
Geef dan toch eenvoudigere voorbeeldenwaar hij WEL iets aan heeft.
Ge bedoelt zoals die eerste 3 voorbeelden die ik geef?

zet er dan nog speciaal een smileyke bij...

Cycloon

Legacy Member
In VB.Net kan je de option strict afzetten, dan hoef je helemaal niet te casten. Er zijn overigens veel non strong typed talen als je niet graag cast.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan