2016-08-04 57 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我相信這裏應該沒有其他的選擇:( –

相關問題