我打电话的时候:
SynchronizedReadOnlyCollection<T>.Contains ( T, IEqualityComparer<T> )
无法致电:
IEqualityComparer<T>.Equals(T x, T y)
我这里有示例代码:
执行此行:
bool r = _order.Products.Contains ( p, Product.s_ProductByNameEqualityComparer );
所以它应该执行这一行:
Console.Out.WriteLine ( string.Concat ( "ProductByNameEqualityComparer.Equals(){", x.Name, "}{", y.Name, "}" ) );
但它没有向控制台写任何内容。有什么想法吗?
答案 0 :(得分:2)
您的代码存在两个问题:
SynchronizedReadOnlyCollection<T>
的单个参数构造函数采用syncRoot object
,而不是基础集合,请查看构造函数here周围的文档。
与其他只读集合包装器不同,SynchronizedReadOnlyCollection<T>
还会获取所提供集合的快照,而不是保留对底层集合的引用,这可以在源代码{{3}中看到}。
说实话,我无法想象曾经使用SynchronizedReadOnlyCollection<T>
,如果它保留了对底层集合的引用它可能有一些用处,但是因为它需要一个快照,它对我来说似乎100%无用,为什么要锁定只能从中读取的资源?那个甚至没有实现IReadOnlyCollection<T>
的事实,我不打算尝试使用它。
在从这种类型派生并使用Items
属性来改变底层集合时,可能有一个用例,但是我没有看到这样做的例子。
答案 1 :(得分:0)
Order.Products
中没有任何内容。您可以将项目添加到内部_products
列表,但不会更改_productsSol
。
_productsSol = new SynchronizedReadOnlyCollection<Product> ( _products );}
使用_products的当前内容创建一个新的只读集合,该内容为空。 _products
更改时,它不会更新其内容。如果确实如此,它将不是一个只读集合。