2013-10-03 59 views
0

見註釋代碼的問題...爲什麼這一行代碼與上面兩個不同呢?

public struct Key 
{ 
    public string Name; 
    public object Value; 
} 


public class PrimaryKey 
{ 
    Dictionary<string, Key> _keys = new Dictionary<string, Key>(); 

    object this[string index] 
    { 
     get 
     { 
      return _keys[index].Value; 
     } 
     set 
     { 
      if (!_keys.ContainsKey(index)) 
       _keys.Add(index, new Key() { Name = index, Value = value }); 
      else 
      { 
       var k = _keys[index];  // This compiles 
       k.Value = value;    // just fine. 

       _keys[index].Value = index; // So why wouldn't this? 
      } 
     } 
    } 
} 

我得到的錯誤:

Cannot modify the return value of Dictionary<string,Key>.this[string] because it is not a variable

+0

錯誤似乎在返回_keys [index] .Value; –

+0

閱讀此篇http://stackoverflow.com/a/6255368/1714342 – wudzik

回答

2

由於Key是結構和結構是值類型,當你通過一個方法,屬性或訪問索引器返回結構實例的副本,而不是實例本身。嘗試聲明Keyclass。有關詳細信息,您可以搜索結構和類或值和引用類型之間的差異。

+0

呃......我知道這是讓我感到愚蠢的事情。謝謝。 – BVernon

2

這完全是因爲你的Key是一個結構。該值被複製出來..這意味着進行更改實際上除了更改新丟棄的副本之外不會執行任何其他操作。編譯器正在阻止這種情況發生。

它更改爲一類會給你你後的功能..但實際上可能不是你想要的東西:

public class Key { } 
+0

是的,我只需要將它改爲一堂課。我從來沒有爲任何東西創建結構,但是在我腦海裏,我正在考慮什麼時候使用struct和類的「最佳實踐」,現在看起來這是一個好主意。 – BVernon

0

你的前兩行並編譯,但他們不工作。要改變存儲在你必須把改變的值回到字典詞典的價值:

var k = _keys[index]; 
k.Value = value; 
_keys [index] = k; 

當您更改從在同一個語句的字典中獲得的價值,編譯器會注意到,你是要做一些沒有道理的事情,但是當你把它分成兩個語句時,編譯器不能保護你自己。

這種怪癖是建議不要讓結構變化的原因之一。通過一個類,你改變這個值的方式,以及一個不可變的結構,你都不會犯這樣的錯誤。

相關問題