有 3 种方法可以将项目添加到大多数列表...
- 通过直接的公共 API 方法,通常
Add(SomeType)
- 通过通用
IList<T>.Add(T)
接口 - 通过非泛型
IList.Add(object)
接口方法
而且您通常希望它们的行为或多或少相同。但是,LINQEntitySet<T>
是……在 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,3.5 中也存在问题set.Assign(set)
,但现在已在 4.0 中修复。)