有 3 种方法可以将项目添加到大多数列表...
- 通过直接的公共(public) API 方法,通常是
Add(SomeType)
- 通过通用
IList<T>.Add(T)
界面 - 通过非通用
IList.Add(object)
接口(interface)方法
并且您通常希望它们的行为或多或少相同。但是,LINQ 的 EntitySet<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 中修复。)
最佳答案
有趣的是,现在已经为几个版本确定了这一点(你说 3.5 的问题在 4.0 中得到了修复)。 Here is a post from 2007.其余IList
4.0 中的方法正确绑定(bind)到 IList<T>
方法。我认为有 2 种可能的解释(错误/功能多样性):
- 这是 Microsoft 尚未修复的实际错误。
- 这是一些其他 Microsoft 代码正在
利用利用来添加项目的功能,无需设置HasLoadedOrAssignedValues
.
可能两者兼而有之 - 框架内的其他代码正在依赖的错误。听起来像是有人对自己说:
No one is really going to cast this into an IList and then call the Add method, right?
关于c# - EntitySet - IList.Add 没有设置分配是否有合理的理由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6194639/