c# - EntitySet - IList.Add 没有设置分配是否有合理的理由?

标签 c# .net linq linq-to-sql entityset

有 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 种可能的解释(错误/功能多样性):

  1. 这是 Microsoft 尚未修复的实际错误。
  2. 这是一些其他 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/

相关文章:

c# - 重命名文件自己打开

c# - Visual C# 2010 Express 中的单元测试?

c# - 从字符串中提取值

c# - Convert.ToSingle(string) C# 转换歧义

c# - 查询和映射复杂对象

c# - 如何在列表中查找总和小于或等于数字的项目

c# - 将数据从一个对象复制到另一个具有有限属性的对象

.net - 有意义地精简异常/Environment.StackTrace

.net - VB.NET中Integer和Int32有什么区别?

c# - 带有 DefaultIfEmpty 和 select new {} 的 Linq