【问题标题】:Problem with identical namespace and class name in C# [duplicate]C#中名称空间和类名相同的问题[重复]
【发布时间】:2021-03-29 17:31:47
【问题描述】:
        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
  • 如果B类重命名为A类那么VS认为LedgerCommander.A.A.a可以简化为A.A.a
    • 如果我尝试使用A.a,则会出现错误消息
      • '命名空间 LedgerCommander.A 中不存在类型或命名空间名称“a”
      • 似乎using 被忽略了

这是c#中的一个特性还是一个bug?

【问题讨论】:

    标签: c# namespaces using


    【解决方案1】:

    如果出现歧义,C# 将始终更喜欢命名空间而不是类。如果你向LedgerCommander.A 添加另一个类,这将变得非常明显:你仍然需要使用A.A.a 来访问A 类,但A.Foo 可以正常工作。

    另请注意,这仅适用于MyClassLedgerCommander 中;如果将其放入另一个命名空间,则必须使用 using LedgerCommander; 才能获得相同的行为。

    C# 设计指南对此非常具体 (https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/names-of-namespaces):

    不要对命名空间和该命名空间中的类型使用相同的名称。

    类型绑定不会回溯。如果有歧义,您将需要完全限定类型名称。有时这就像使用命名空间和类型名称一样简单(如您的情况),但有时您需要 full 路径,可能包括一个外部别名(哎哟)。只是不要这样做。

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 2011-01-15
      • 1970-01-01
      • 2013-04-17
      相关资源
      最近更新 更多