2016-08-04 16 views
-4

Ich möchte einen Werttyp Box und geben Sie implizite Konvertierungen. Leider macht es so macht wie ein Referenz-Typ verhält stoppen heißtMaking Werttyp verhalten sich wie ein Referenztyp mit Boxen und impliziten Konvertierungen

MyTnt i1 = 3; //MyValue has a field value = 3 
MyInt i2 = 5; //value = 5 

i1 = i2;  //both i1 and i2 = 5 
i2 = 4;  //i1 = 5, i2 = 4; should be i1 = i2 = 4; 

Ist es möglich, Boxen mit impliziten Konvertierungen zu schreiben, so dass es hier verhält sich wie erwartet?

+4

Referenztypen die gleiche Art und Weise, wie Ihr Beispiel verhalten. – Lee

+0

MyInt ist ein Wrapper für int und hat implizite Konvertierungen. Ich habe gerade so viel getestet, was ich oben geschrieben habe, und ich kann Ihnen sagen, dass es sich nicht so verhält, wie ich es von ihnen erwartet habe. – wjtk4444

+0

Ihre Erwartung ist falsch. Schreiben Sie eine Klasse, die nichts mit einem Wrapper über eine Struktur zu tun hat. Schreiben Sie einen ähnlichen Code wie oben. Es wird sich genauso verhalten. Das Schreiben von 'i1 = i2;' verbindet diese Variablen nicht dauerhaft. Das einzige, was passiert, ist, dass diese Variablen für einen bestimmten Zeitpunkt auf dasselbe Objekt verweisen. Das Zuweisen eines anderen Werts zu i2 ändert diese Realität und hat nie etwas mit i1 zu tun. –

Antwort

0

Ich glaube, Sie verstehen einige Punkte falsch.

Eine Sache ist die Schaffung Referenzen ein Objekt oder einen Werttyp zu halten, und eine andere Geschichte ein Argument by reference gibt.

i1 würde auch 4 halten, wenn Sie es unter Bezugnahme auf irgendeine Methode passieren würde:

public void X(int i2, ref MyInt i1) 
{ 
    // When you define a ref parameter 
    // you're not creating a new reference but you're 
    // reusing the given one 
    i1 = i2; 
} 

MyInt i1 = 4; 
MyInt i2 = 0;  

// This would produce what you expect 
X(i2, ref i1); 

// Now i2 is 4 
+0

Ok, ich sehe wo ich einen Fehler gemacht habe. Es sollte i2.value = 4 sein, damit es sich so verhält, wie ich es erwartet hatte. Dann hätte ich in cpp den Zuweisungsoperator richtig übersteuert, aber da es in C# keine solche Möglichkeit gibt, gibt es einen anderen Weg, ihn als "ï2 = 4" aussehen zu lassen und sich so zu verhalten, als wäre er "i2 .value = 4 "? – wjtk4444

+0

@ wjtk4444 Ich schaue später, jetzt muss ich gehen, um zu Abend zu essen, D –

+0

@ wjtk4444 Ich glaube, dass es keine Alternative für diese sein sollte :( –