在注释代码中查看问题...
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?
}
}
}
}
我收到错误:
无法修改
Dictionary<string,Key>.this[string]
的返回值,因为它不是变量
答案 0 :(得分:2)
由于Key
是struct而struct是值类型,当您通过Method,Property或Indexer访问它时,它返回结构实例的副本而不是实例本身。尝试将Key
声明为class
。有关详细信息,您可以搜索结构和类之间或值和引用类型之间的差异。
答案 1 :(得分:2)
纯粹是因为你的Key
是一个结构。该值被复制出来...这意味着除了更改新丢弃的副本之外,进行更改实际上不会执行任何操作。编译器正在阻止这种情况发生。
将它更改为一个类将为您提供您所需的功能..但实际上可能并不是您想要的:
public class Key { }
答案 2 :(得分:0)
你的前两行确实编译,但它们不起作用。要更改存储在字典中的值,您必须将更改后的值放回字典中:
var k = _keys[index];
k.Value = value;
_keys [index] = k;
当您在同一语句中更改从字典中获得的值时,编译器可以注意到您即将执行一些没有意义的事情,但是当您将其分成两个语句时,编译器可以& #39;保护你自己。
这种怪癖是建议不要使结构变得可变的原因之一。对于一个类,你改变价值的方式都是可行的,并且使用不可变的结构你不会犯这样的错误。