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