C# Implizite Typkonvertierung in beide Richtungen möglich?

ML89

Lt. Junior Grade
Dabei seit
Apr. 2014
Beiträge
432
Guten morgen,

ich sitze gerade an der Typkonvertierung bei C#. Ich habe eine Klasse TypA und eine von mir erzeugte Klasse TypB.

In der Klasse TypB sieht es so aus:

Code:
public class TypB
    public string Value { get; set; }

    public static implicit operator TypA(TypB input)
    {
        return new TypA
        {
             Value = input.Value,
        };
    }
an einer anderen Stelle im Programm sieht es dann so aus:

Code:
TypA typA = new TypA();

//Ein bisschen Code

TypB typB = (TypB)typA;
Das Problem ist jetzt, dass wenn ich bei typB.Value ändere das nicht auf TypA.Value übertragen wird. Gefühlt würde ich gerne oben in der impliziten Konvertierung ein { get; set; } setzen, aber das ist leider nicht möglich. Gibt es einen Weg auf typA zuzugreifen?
 

Yuuri

Fleet Admiral
Dabei seit
Okt. 2010
Beiträge
12.501
Das Eine ist ja auch keine Referenz auf das Andere. Wird ja ne Kopie erzeugt. Und nein, auf A kannst du dann nicht mehr zugreifen.
 

hroessler

Commander
Dabei seit
Okt. 2013
Beiträge
3.022
Hi,
Yuuri hat recht. Du müsstest den String (Value) in einem separaten Objekt wrappen und dann eine flache Kopie dieses Wrappers an das neu erzeugte Objekt vom Typ B übergeben. So dürfte es funktionieren.

Eine flache Kopie eines Strings macht in C# i.d.R. sowieso keinen Sinn. Strings nehmen unter den Referenztypen eine Sonderstellung ein, da diese immutable, sprich unveränderlich sind. Änderst du einen String ab, erzeugst du in Wirklichkeit einen neuen, der somit eine andere Speicheradresse hat, und somit zeigt eine Referenz die auf den Originalstring zeigt auch immer auf dessen "Originaltext" und wir niemals eine Änderung mitbekommen.

Mit anderen Referenztypen würde es hingegen funktionieren, sofern deren Properties änderbar sind.

Greetz
hroessler


Greetz
hroessler
 
Zuletzt bearbeitet:

ML89

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Apr. 2014
Beiträge
432
Ok. Da ich da oben ein new drin stehen habe, ist da natürlich nichts mehr zu retten. Was genau bedeutet jetzt ein Objekt wrappen? Und was ist eine flache Kopie?

Das mit dem Wrappen hat geklappt. Wenn ich beim Wrap die Eigenschaft Text verändere, dann ändert sich auch die entsprechende Eigenschaft des Objektes typA
 
Zuletzt bearbeitet:

Affe007

Lt. Commander
Dabei seit
März 2004
Beiträge
1.431
Warum nicht einfach:

Code:
TypA typA = new TypA();
 
//Ein bisschen Code
 
TypB typB = (TypB)typA;
TypB.Value = "bla";
TypA.Value = "bla";
Ich versteh nicht was dein Code bewirken soll.
 
Top