Casting



  • Hallo,

    wieso klappt das Casten nicht ?

    Object obj = plc.Read("MB3"); // Rueckgabe 1
    int zahl = (int)obj;
    


  • Weil du's falsch machst.

    Welchen konkreten Typ hat denn obj?



  • @CSharperNew
    So wie du das machst muss der Typ exakt stimmen.
    Mit (int)x kannst du zwar z.B. einen long in einen int konvertieren. Und du kannst damit auch einen geboxten int in einen int konvertieren. Du kannst damit aber nicht einen geboxten long in einen int konvertieren.

    Angenommen der Typ wäre long, und du weisst dass er immer long sein wird, dann kannst du schreiben

    Object obj = plc.Read("MB3");
    int zahl = (int)(long)obj; // 1) boxed long -> long 2) long -> int
    

    Ansonsten bietet sich an

    Object obj = plc.Read("MB3");
    int zahl = Convert.ToInt32(obj);
    


  • lol,

    ich weiß gar keinen Typ 🙂 Nur dass es die Zahl 1 ist 🙂



  • Dann nimm Convert.ToInt32 .
    Oder guck nach (im Debugger oder mit obj.GetType().Name ).



  • CSharper schrieb:

    lol,

    ich weiß gar keinen Typ 🙂 Nur dass es die Zahl 1 ist 🙂

    dann nimm PHP oder JS oder machs auf Papier 🤡



  • Hi,
    ich bekomme ein Problem bei folgender Berechnung:

    public const double g = 9.809389;
            public double hoehe   = 0.2;
            protected const double F = g * hoehe;
    

    "An object reference is required for the non-static field, method, or property"

    Kann mir jemand sagen wieso das nicht geht? Klar wenn ich die hoehe auch als const deklariere funktioniert es. Aber letztenlich soll die hoehe später eingelesen werden. Es muss also irgendwie ohne const gehen...

    Danke im Voraus



  • also der exakte Typ ist UInt16 . Ich frage mich warum ich den nicht in einen int casten kann. Schließlich ist int groesser als UInt16 .



  • Liegt wohl daran dass UInt16 eine Struktur ist.



  • NeulingCasting schrieb:

    also der exakte Typ ist UInt16 . Ich frage mich warum ich den nicht in einen int casten kann. Schließlich ist int groesser als UInt16 .

    Lies das hier
    https://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

    Die Konvertierung object -> int wird als "unboxing" bezeichnet.
    Das funktioniert aber nur, wenn das object erzeugt wurde indem wirklich ein int "geboxed" wurde und nicht ein anderer integraler Typ.
    Wenn es ein ushort (aka. UInt16 ) war, dann funktioniert es nicht.
    Wenn du dagegen erstmal mit object -> ushort den ushort "auspackst", dann kannst du den ausgepackten ushort danach natürlich in einen int konvertieren.



  • @Holger

    mach doch statt

    protected const double F = g * hoehe;
    

    sowas

    protected double F(){ return g * hoehe ;}
    


  • Oder wenn du keine Methode willst:

    protected double F
    {
        get
        {
            return g * hoehe;
        }
    }
    

    Lässt sich dann verwenden wie ein readonly Feld. 🙂


Log in to reply