ほとんどのリストにアイテムを追加する方法は3つあります...
- 通常、直接パブリックAPIメソッドを介して
Add(SomeType)
IList<T>.Add(T)
汎用インターフェース経由- 非ジェネリック
IList.Add(object)
インターフェイス方式を介して
そしてあなたは通常それらが多かれ少なかれ同じように振る舞うことを期待します。ただし、LINQEntitySet<T>
は...3.5と4.0の両方に固有です。IList
APIは、セットに「割り当て済み」のフラグを付けません(他の2つのメカニズムはフラグを立てます)。これは些細なことのように聞こえますが、ボイラープレートコードのシリアル化に大きく影響する(つまり、スキップされる)という点で重要です。
例:
EntitySet<string> set1 = new EntitySet<string>();
set1.Add("abc");
Debug.Assert(set1.Count == 1); // pass
Debug.Assert(set1.HasLoadedOrAssignedValues, "direct"); // pass
EntitySet<string> set2 = new EntitySet<string>();
IList<string> typedList = set2;
typedList.Add("abc");
Debug.Assert(set2.Count == 1); // pass
Debug.Assert(set2.HasLoadedOrAssignedValues, "typed list"); // pass
EntitySet<string> set3 = new EntitySet<string>();
IList untypedList = set3;
untypedList.Add("abc");
Debug.Assert(set3.Count == 1); // pass
Debug.Assert(set3.HasLoadedOrAssignedValues, "untyped list"); // FAIL
さて...これは私にとって非常に驚くべきことです。非常に多く、何が起こっているのかを特定するためにコードを上向きに追跡するのに2時間以上かかりました。それで...
これには正当な理由がありますか?それともこれは単なるバグですか?
(FWIW、3.5でも問題がありましたset.Assign(set)
が、これは4.0で修正されました。)