gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:57:47 24 4
gpt4 key购买 nike

有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com