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