В С# статические члены суперкласса "наследуются" в области подклассов. Например:
class A { public static int M() { return 1; } }
class B : A {}
class C : A { public new static int M() { return 2; } }
[...]
A.M(); //returns 1
B.M(); //returns 1 - this is equivalent to A.M()
C.M(); //returns 2 - this is not equivalent to A.M()
Теперь вы не можете наследовать статические классы, и единственное место, где я могу себе представить, что статическое наследование может иметь значение, полностью игнорирует его: хотя вы можете сделать общее ограничение, для которого параметр типа T
должен быть подклассом A
, вы по-прежнему не можете вызвать T.M()
(что, вероятно, упрощает работу для виртуальной машины), не говоря уже о написании другой реализации M
в подклассе и использовать ее.
Итак, "наследование" статических членов просто выглядит как загрязнение пространства имен; даже если вы явно квалифицируете имя (т.е. B.M
) A
, версия по-прежнему разрешена.
Изменить сравнить с пространствами имен:
namespace N1{ class X(); }
namespace N1.N2 { class X(); }
namespace N1.N2.N3 { [...] }
Внутри N1.N2.N3
Имеет смысл, что если я использую X
без квалификации, это относится к N1.N2.X
. Но если я явно ссылаюсь на N1.N2.N3.X
- и такой класс не существует, я не ожидаю, что он найдет версию N2
; и, действительно, компилятор сообщает об ошибке, если вы попробуете это. В отличие от этого, если я явно ссылаюсь на B.M()
, почему компилятор не сообщает об ошибке? В конце концов, нет метода "М" в "В"...
Какова цель этого наследования? Можно ли конструктивно использовать эту функцию?