Есть 3 способа добавления элементов в большинство списков ...
Add (SomeType)
IList .Add (T)
IList.Add (object)
, и вы обычно ожидаете их вести себя более или менее так же. Однако LINQ EntitySet
... специфичен как для 3.5, так и для 4.0; IList
API не помечает набор как «назначенный» - два других механизма делают - это звучит тривиально, но важно, поскольку сильно влияет сериализация (т.е. вызывает ее пропуск) в шаблонном коде.
Пример:
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, также была проблема в set.Assign (set)
в 3.5, но теперь это исправлено в 4.0.)