コレクションに保存する必要のある構造体があります。構造体には、ディクショナリを返すプロパティがあります。
public struct Item
{
private IDictionary<string, string> values;
public IDictionary<string, string> Values
{
get
{
return this.values ?? (this.values = new Dictionary<string, string>());
}
}
}
public class ItemCollection : Collection<Item> {}
テストしたところ、アイテムをコレクションに追加してからディクショナリにアクセスしようとすると、structvaluesプロパティが更新されないことがわかりました。
var collection = new ItemCollection { new Item() }; // pre-loaded with an item
collection[0].Values.Add("myKey", "myValue");
Trace.WriteLine(collection[0].Values["myKey"]); // KeyNotFoundException here
ただし、最初にアイテムをロードしてからコレクションに追加すると、値フィールドは維持されます。
var collection = new ItemCollection();
var item = new Item();
item.Values.Add("myKey", "myValue");
collection.Add(item);
Trace.WriteLine(collection[0].Values["myKey"]); // ok
このタイプでは構造体が間違ったオプションであるとすでに判断しており、クラスを使用しても問題は発生しませんが、2つのメソッドの違いに興味があります。誰かが何が起こっているのか説明できますか?