2016-08-04 2 views
-4

値型をボックスに入れて暗黙的に変換したいと思います。残念ながら、それは参照型のように動作停止になりそうすなわちボクシングと暗黙の変換を使用して、値型を参照型のように動作させる

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; 

それは予想通り、それはここに振る舞うので、暗黙の型変換を使用してボクシングを書くことは可能ですか?

+4

リファレンスタイプはあなたの例と同じように振る舞います。 – Lee

+0

MyIntはintのラッパーであり、暗黙的な変換を行います。私はちょうど私が上に書いたことをかなりテストした、そして私はあなたに言うことができる、それは私がそれがそれらの期待されたと言ったように振る舞いません。 – wjtk4444

+0

あなたの期待は間違っています。構造体上のラッパーであることとは関係のないクラスを書く。上記と同様のコードを書いてください。同じように動作します。 'i1 = i2; 'と書くことは、これらの変数を恒久的にリンクしているわけではありません。起こっている唯一の事は、時間の経過とともに、これらの変数が同じオブジェクトを参照することです。異なる値をi2に割り当てることは現実を変え、i1とは何も関係がありません。 –

答えて

0

私はいくつかの点を誤解していると思います。

オブジェクトまたは値型を保持する参照参照を作成することと、別のストーリーが引数を指定することですby reference

i1あなたには、いくつかの方法で参照することによって、それを通過する場合も4を開催する:

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

私は間違いをどこに見ましたか?それは私が期待したように動作するためにi2.value = 4だったはずです。次に、cppで代入演算子を正しい方法でオーバーライドしましたが、C#でそのような可能性がないので、 "ı2= 4"のように見せて、それが "i2 .value = 4 "? – wjtk4444

+0

@ wjtk4444後で見てみましょう、今私は夕食を食べに行かなければなりませんD –

+0

@ wjtk4444私はこれに代わるべきではないと信じています:( –

関連する問題