If you look at the code for a read-only collection it does not have an "Add" method, but instead defines the ICollection<T>.Add(T Value)
method (explicit interface implementation).
When I did something similar with my ReadOnlyDictionary class, FxCop 10 complains that I'm breaking 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 }
}
So, is this a false positive? Is Microsoft's base code bad? What gives?
A lot of Microsoft code "fails" FxCop and StyleCop. The primary reason is that these tools are new; a lot of the BCL was written by many programmers before anyone had any experience with .NET at all.
I'd say in this particular case it's a false positive. But it depends on what you mean by "false". I think the run-time nature of the collection interface is hokey at best. It could be argued that read-only collections are in violation of the LSP. But the explicit implementation acts as a "hint" that your class is not really a (full) collection.