Я размышлял о системе типов С# и CIL сегодня, и Ive начал задаваться вопросом, почему статические классы считаются классами. Существует много способов, по которым они не являются классами:
- "Обычный" класс может содержать нестатические элементы, статический класс can not. В этом отношении класс больше похож на структуру, чем на статический класс, а структуры имеют отдельное имя.
- У вас может быть ссылка на экземпляр "нормального" класса, но не на статический класс (несмотря на то, что он считается "ссылочным типом" ). В этом отношении класс более похож на интерфейс, чем на статический класс, но все же интерфейсы имеют отдельное имя.
- Имя статического класса никогда не может использоваться в любом месте, где обычно должно быть имя типа: вы не можете объявить переменную этого типа, вы не можете использовать ее как базовый тип, и вы не можете использовать ее как общий тип. В этом отношении статические классы несколько больше похожи на пространства имен.
- "Обычный" класс может реализовывать интерфейсы. Еще раз, что делает классы более похожими на структуры, чем на статические классы.
- "Обычный" класс может наследовать от другого класса.
Также странно, что статические классы считаются производными от System.Object. Хотя это позволяет им "наследовать" статические методы Equals и ReferenceEquals, цель этого наследования сомнительна, так как вы будете называть эти методы на объекте в любом случае. С# даже позволяет вам указывать это бесполезное наследование явно на статические классы, но не на интерфейсы или структуры, где на самом деле имеет место неявный вывод из объекта и System.ValueType.
Что касается аргумента subset-of-features: Статические классы имеют подмножество функций классов, но они также имеют подмножество функций struct. Все вещи, которые делают класс отличным от других типов, похоже, не применяются к статическим классам.
Что касается аргумента typeof: Создание статического класса в новый и другой тип типа не исключает его использования в typeof.
Учитывая явную странность статических классов и ограниченность сходств между ними и "нормальными" классами, не должны ли они быть сделаны отдельным типом типа вместо специального класса?