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. einenlong
in einenint
konvertieren. Und du kannst damit auch einen geboxtenint
in einenint
konvertieren. Du kannst damit aber nicht einen geboxtenlong
in einenint
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 mitobj.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.aspxDie Konvertierung
object
->int
wird als "unboxing" bezeichnet.
Das funktioniert aber nur, wenn das object erzeugt wurde indem wirklich einint
"geboxed" wurde und nicht ein anderer integraler Typ.
Wenn es einushort
(aka.UInt16
) war, dann funktioniert es nicht.
Wenn du dagegen erstmal mitobject
->ushort
denushort
"auspackst", dann kannst du den ausgepacktenushort
danach natürlich in einenint
konvertieren.
-
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.