В C # статические члены суперкласса «наследуются» в области видимости подклассов. Например:
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()
, почему компилятор не сообщает об ошибке? В конце концов, в «Б» нет метода «М» ...
Какая цель у этого наследования? Можно ли как-то конструктивно использовать эту фичу?
public static abstract string Method();
, например, требуя подклассов для реализации этого статического члена. Это сделало бы меня таким-таким счастливым! - person ErikE   schedule 16.03.2016TStatic
с ограничениемwhere TStatic : struct, IMyMethod
, а затем в коде потребления писатьdefault(TStatic).Method()
. Таким образом, вы можете хотя бы статически требовать наличия алгоритма, даже если синтаксис далеко не очевиден. - person Eamon Nerbonne   schedule 16.03.2016new
иногда, чтобы скрыть / затенять унаследованный член, который на самом деле не может быть унаследован, чертовски раздражает. - person RBarryYoung   schedule 22.12.2020