C# 中相同名称空间和 class 名称的问题
Problem with identical namespace and class name in C#
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; } }
}
}
- 这很好用,VS studio 认识到 return
LedgerCommander.A.B.a
可以简化为 B.a
- 如果把classB重命名为classA 那么VS认为
LedgerCommander.A.A.a
可以简化为A.A.a
- 如果我尝试使用
A.a
则会出现错误消息
- '命名空间LedgerCommander.A
中不存在类型或命名空间名称'a'
- 似乎
using
被忽略了
它是 c# 中的功能还是错误?
C# 在出现歧义的情况下总是更喜欢命名空间而不是 class。如果将另一个 class 添加到 LedgerCommander.A
,它将变得非常明显:您仍然需要使用 A.A.a
来访问 class A
,但是 A.Foo
将正常工作。
另请注意,这仅适用于 MyClass
在 LedgerCommander
中;如果将它放入另一个命名空间,则必须使用 using LedgerCommander;
才能获得相同的行为。
C# 设计指南对此非常具体 (https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-namespaces):
DO NOT use the same name for a namespace and a type in that namespace.
类型绑定不回溯。如果有歧义,您将需要完全限定类型名称。有时这就像使用名称空间和类型名称一样简单(如您的情况),但有时您需要 完整 路径,可能包括外部别名(哎哟)。只是不要这样做。
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; } }
}
}
- 这很好用,VS studio 认识到 return
LedgerCommander.A.B.a
可以简化为B.a
- 如果把classB重命名为classA 那么VS认为
LedgerCommander.A.A.a
可以简化为A.A.a
- 如果我尝试使用
A.a
则会出现错误消息- '命名空间LedgerCommander.A 中不存在类型或命名空间名称'a'
- 似乎
using
被忽略了
- 如果我尝试使用
它是 c# 中的功能还是错误?
C# 在出现歧义的情况下总是更喜欢命名空间而不是 class。如果将另一个 class 添加到 LedgerCommander.A
,它将变得非常明显:您仍然需要使用 A.A.a
来访问 class A
,但是 A.Foo
将正常工作。
另请注意,这仅适用于 MyClass
在 LedgerCommander
中;如果将它放入另一个命名空间,则必须使用 using LedgerCommander;
才能获得相同的行为。
C# 设计指南对此非常具体 (https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-namespaces):
DO NOT use the same name for a namespace and a type in that namespace.
类型绑定不回溯。如果有歧义,您将需要完全限定类型名称。有时这就像使用名称空间和类型名称一样简单(如您的情况),但有时您需要 完整 路径,可能包括外部别名(哎哟)。只是不要这样做。