namespace LedgerCommander.A
{
class B
{
static public int a = 7;
}
}
namespace LedgerCommander
{
using LedgerCommander.A;
public class MyClass
{
private int myProperty;
public int MyProperty { get { return LedgerCommander.A.B.a; } }
}
}
LedgerCommander.A.B.a
можно упростить до B.a
LedgerCommander.A.A.a
можно упростить до A.A.a
A.a
, то появится сообщение об ошибке
using
игнорируетсяЭто функция или ошибка в С#?
C# всегда будет предпочитать пространство имен классу в случае неоднозначности. Если вы добавите еще один класс к LedgerCommander.A
, это станет совершенно очевидно: вам все равно нужно будет использовать A.A.a
для доступа к классу A
, но A.Foo
будет работать нормально.
Также обратите внимание, что это работает только потому, что MyClass
находится в LedgerCommander
; если вы поместите его в другое пространство имен, вам придется использовать using LedgerCommander;
, чтобы получить такое же поведение.
Рекомендации по дизайну C# довольно специфичны по этому поводу (https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-namespaces):
НЕ ИСПОЛЬЗУЙТЕ одно и то же имя для пространства имен и типа в этом пространстве имен.
Привязка типа не отменяется. Если есть неоднозначность, вам нужно будет полностью уточнить имя типа. Иногда это так же просто, как использование пространства имен и имени типа (как в вашем случае), но иногда вам понадобится полный путь, возможно, включая внешний псевдоним (ой). Просто не делай этого.