 <blockquote> <p>So, the "inheritance" of static members merely looks like namespace pollution</p> </blockquote> <p>That's right, except that one guy's pollution is another guy's added spicy flavouring.</p> <p>I think Martin Fowler, in his work on DSLs, has suggested using inheritance in this way to allow convenient access to static methods, allowing those methods to be used without class name qualification. So the calling code has to be in a class that inherits the class in which the methods are defined. (I think it's a rotten idea.)</p> <p>In my opinion, static members should not be mixed into a class with a non-static purpose, and the issue you raise here is part of the reason why it's important not to mix them.</p> <p>Hiding private static <em>mutable</em> data inside the implementation of an otherwise "instancey" class is particularly horrible. But then there are static methods, which are even worse mixers. Here's a typical use of static methods mixed into a class:</p> <pre><code>public class Thing { // typical per-instance stuff int _member1; protected virtual void Foo() { ... } public void Bar() { ... } // factory method public static Thing Make() { return new Thing(); } } </code></pre> <p>It's the static factory method pattern. It's pointless most of the time, but even worse is that now we have this:</p> <pre><code>public class AnotherThing : Thing { } </code></pre> <p>This now has a static <code>Make</code> method which returns a <code>Thing</code>, not a <code>AnotherThing</code>.</p> <p>This kind of mismatch strongly implies that anything with static methods should be sealed. Static members fail to integrate well with inheritance. It makes no sense to have them heritable. So I keep static things in separate static classes, and I gripe about redundantly having to declare every member static when I've already said that the class is static.</p> <p>But it's just one of those too-late-now things. All real, working languages (and libraries, and products) have a few of them. C# has remarkably few.</p>