Was ist der Unterschied zwischen...

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Was ist der Unterschied zwischen...

      ...dieser Schreibweise:

      C#-Quellcode

      1. IMyTimerBlock Zeitgeber = GridTerminalSystem.GetBlockWithName("TIMER-ONE") as IMyTimerBlock;

      ...und dieser Schreibweise:

      C#-Quellcode

      1. IMyTimerBlock Zeitgeber = (IMyTimerBlock)GridTerminalSystem.GetBlockWithName("TIMER-ONE");

      Für mein bisheriges Verständnis müsste beides aufs Gleiche herauskommen,
      oder sind da noch diverse Feinheiten, die mir entgangen sind?

      Anmerkung dazu:

      Auch wenn ich nach all den Jahren etwas eingerostet bin - C# ist für mich kein böhmisches Dorf.

      Die spielinterne Abfrage der Blöcke, Zustände etc. ist für mich aber noch etwas... gewöhnungsbedürftig 8|
    • Variante 1 ist ein reiner Cast.
      Variante 2 ist eine explizite Typenwandlung.

      Ich vermute jetzt bist Du genauso schlau wie vorher :P

      Fangen wir mit der impliziten Umwandlung an:

      C#-Quellcode

      1. using UnityEngine;
      2. Vector3 test = new Vector3 (1, 2, 3);
      3. object pointer = test;
      4. Vector3 test2 = pointer;

      Meine Beispiele kommen aus Unity aber lass Dich davon nicht stören.
      Diese Code ergibt folgende Meldung:

      error CS0266: Cannot implicitly convert type `object' to `UnityEngine.Vector3'. An explicit conversion exists (are you missing a cast?)
      Implizite Umwandlungen lassen sich gut benutzen um einen Typ, der in der Domain(Reichweite/Menge) eines anderen Typen enthalten ist, wie zb:

      C#-Quellcode

      1. int typ1 = 1;
      2. float typ2 = typ1;


      Versuch man einen Typ mit erweiterter Domain in einen Typ mit eingeschränkter Domain umwandeln, geht das das nicht mit inliziter Umwandlung:

      C#-Quellcode

      1. float typ2 = 1.0f;
      2. int typ1 = typ2;

      error CS0266: Cannot implicitly convert type `float' to `int'. An explicit conversion exists (are you missing a cast?)
      Hier kommt die explizite Umwandlung ins Spiel:

      C#-Quellcode

      1. float typ2 = 1.0f;
      2. int typ1 = (int) typ2;
      3. Vector3 test = new Vector3 (1, 2, 3);
      4. object pointer = test;
      5. Vector3 test2 = (Vector3) pointer;
      Der reine Cast hingegen, geht nur bei Byte-kompatiblen Typen und NULL erlaubten werten, weil AS NULL zurück gibt, falls die Konvertierung fehl schlägt.

      C#-Quellcode

      1. class A {}
      2. class B : A {}
      3. class C : A {}
      4. B typ2 = new B ();
      5. A typ1 = typ2;
      6. C typ3 = typ1 as C; // typ3 is immer null weil Domain/Menge von B nicht in C enthalten ist.

      Was intern Bytegenau passiert hab ich nicht mehr im Kopf... ;)

      /edit: Ganz vergessen, man kann aber auch den Umweg über einen Copy-Constructor gehen:

      C#-Quellcode

      1. class A {}
      2. class B : A {}
      3. class C : A {
      4. public C(B src) {}
      5. }
      6. B typ2 = new B ();
      7. A typ1 = typ2;
      8. C typ3 = new C((B) typ1);

      Und ja nicht vergessen, man kann nur casten, was auch da ist:

      C#-Quellcode

      1. A typ1 = new A ();
      2. B typ2 = (B) typ1;
      InvalidCastException: Cannot cast from source type to destination type.

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Gandur ()

    • JumpinJack schrieb:

      Die spielinterne Abfrage der Blöcke, Zustände etc. ist für mich aber noch etwas... gewöhnungsbedürftig
      Ich glaube, das geht so ziemlich allen so! :D



      Übrigens, gute Erklärung, @Gandur! Schlüssig und einfach... Also für mich jedenfalls... Aaaaber: Es fehlt eine TL;DR Variante (für die lesefaulen unter uns):
      Variante 1 - Falls Cast nicht möglich: Variable wird null (impliziert natürlich, dass Typ null erlaubt).
      Variante 2 - Falls Cast nicht möglich: Wirft Exception (wenn nicht schon der Compiler sagt "Nene, Du, das is nich drinne!" ;D ).