FxCop:CA1033 - 微软对ReadOnlyCollection的实现违反了这一点?

m-y*_*m-y 5 c# fxcop explicit-interface readonly-collection

如果查看只读集合的​​代码,它没有"添加"方法,而是定义ICollection<T>.Add(T Value)方法(显式接口实现).

当我用我的ReadOnlyDictionary类做了类似的事情时,FxCop 10抱怨我打破了CA1033.

public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
    //CA1033 ERROR
    void IDictionary<TKey, TValue>.Add(TKey, TValue) { //Throw Exception }
}

public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
    //NO CA1033 ERROR
    Add(TKey, TValue) { //Throw Exception }
}
Run Code Online (Sandbox Code Playgroud)

ReadOnlyCollectionClass:

public class ReadOnlyCollection<T> : ICollection<T>
{
    void ICollection<T>.Add(T item) { //Throw Exception }
}
Run Code Online (Sandbox Code Playgroud)

那么,这是误报吗?微软的基本代码是坏的吗?是什么赋予了?

Ste*_*ary 5

一个很多的微软的源代码"失败"的FxCop和StyleCop的.主要原因是这些工具是新的; 很多BCL都是由许多程序员编写的,然后才有对.NET有任何经验.

我会说在这个特殊情况下这是误报.但这取决于你所说的"假".我认为集合界面的运行时性质最好.可以认为只读集合违反了LSP.但是显式实现充当了"暗示",即你的类不是真正的(完整)集合.

  • 根本原因是当在.net 2中创建的集合接口时,不提供`IReadOnlyList <T>`接口的糟糕设计决策. (2认同)