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

时间:2011-07-11 20:51:13

标签: 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 }
}

ReadOnlyCollectionClass:

public class ReadOnlyCollection<T> : ICollection<T>
{
    void ICollection<T>.Add(T item) { //Throw Exception }
}

那么,这是假阳性吗?微软的基本代码是坏的吗?是什么给了什么?

3 个答案:

答案 0 :(得分:5)

Microsoft代码 lot “失败”FxCop和StyleCop。主要原因是这些工具是新的;很多BCL都是由许多程序员在任何人完全没有.NET经验之前编写的。

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

答案 1 :(得分:1)

这是假阳性。在只读集合中,Add 永远不会有用。

只需要满足接口,因为没有有效/内置的只读IList[<T>]等效,它通过索引提供读访问。

在这种情况下,将它放在视线之外是完全合理的。

答案 2 :(得分:1)

我在这个问题上与Marc达成一致 - 它没用,所以最好尽可能隐藏它。同样值得考虑的是,ReadOnlyCollection可能具有类似的抑制,原因完全相同。不幸的是,鉴于mscorlib的发布版本不包含SuppressMessage属性,我们没有简单的方法来了解是否可能出现这种情况。

.NET Framework中有一些通用的ReadOnlyDictionary实现,尽管它们在现有版本中都不公开。其中至少有一个(System.Dynamic.Utils.ReadOnlyDictionary)使用显式接口实现“修改”方法。