Mar*_*ell 40 .net c# linq entityset linq-to-sql
向大多数列表添加项目有3种方法...
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
Run Code Online (Sandbox Code Playgroud)
现在......这让我感到非常惊讶; 以至于我花了2个多小时跟踪代码以隔离发生的事情.所以...
这有什么明智的理由吗?或者这只是一个错误?
(FWIW,set.Assign(set)
3.5中也有一个问题,但现在已经修复了4.0.)
令人惊讶的是,差异似乎源于这样一个事实:IList.Add
和IList<T>.Add
方法实际上有不同的语义:
IList.Add
如果添加的实体已经存在,则该方法失败LIst<T>.Add
如果已经存在,则该方法移除然后重新添加实体这种差异的明显原因是IList.Add
接口方法被定义为返回添加的实体的索引,对于典型的实现,该索引IList.Add
将始终是Count
之前的集合的索引Add
.
在任何情况下,因为这两个实现是故意不同的,所以作者似乎只是偶然地忽略this.OnModified()
了IList.Add
版本中的调用.
归档时间: |
|
查看次数: |
3188 次 |
最近记录: |