【发布时间】:2011-05-31 23:18:43
【问题描述】:
向大多数列表添加项目有 3 种方法...
- 通过直接的公共 API 方法,通常是
Add(SomeType) - 通过通用的
IList<T>.Add(T)接口 - 通过非泛型
IList.Add(object)接口方法
并且您通常希望它们的行为或多或少相同。然而,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 中修复。)
【问题讨论】:
-
Add() 方法调用 OnModified,IList.Add() 显式实现不调用。当然没有人使用它,未使用的代码有错误。 IList.Add() 的返回类型肯定是错误生成器。
标签: c# .net linq linq-to-sql entityset