2013-10-03 60 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; 

当您更改从在同一个语句的字典中获得的价值,编译器会注意到,你是要做一些没有道理的事情,但是当你把它分成两个语句时,编译器不能保护你自己。

这种怪癖是建议不要让结构变化的原因之一。通过一个类,你改变这个值的方式,以及一个不可变的结构,你都不会犯这样的错误。

相关问题