【问题标题】:Namespace collisions命名空间冲突
【发布时间】:2010-09-20 17:16:40
【问题描述】:

.NET 怎么可能在这种情况下找到错误的“MyType”?

我正在处理的项目中有一个 A.B.C.D.MyType 类型,并且我正在引用一个具有 A.B.MyType 类型的 DLL?我没有任何“使用 A.B;”在我的代码中的任何地方声明,我确实有“使用 A.B.C.D;”。当我编译时,编译器认为任何对“MyType”的裸引用都意味着“A.B.MyType”。

我知道我可以重命名类或使用别名,但我想知道这怎么可能。

有什么想法吗?

谢谢!

【问题讨论】:

    标签: c# .net namespaces


    【解决方案1】:

    您是否在 A.B 命名空间下的命名空间中工作? (例如 A.B.X)如果是这样,C# 命名空间解析 (ECMA-334 C# Language Specification : 10.8 10.8 Namespace and type names) 会说:

    ... 对于每个命名空间 N,开始 与其中的命名空间 出现命名空间或类型名称, 继续每个封闭 命名空间(如果有),并以 全局命名空间,如下 步骤被评估,直到一个实体 位于...

    然后是:

    如果 K 为零且命名空间 声明包含一个 外部别名指令或 using-alias 指令关联 名称 I 带有导入的命名空间 或键入,然后 namespace-or-type-name 指的是 命名空间或类型

    这意味着名称解析从当前命名空间开始,搜索直到根目录的所有命名空间,并且只有在这种分层搜索结束后,才会搜索使用using 子句导入的命名空间。

    以下示例打印“Ns1.Foo”

    using Ns1.Foo.Foo2;
    
    namespace Ns1.Foo
    {
        class Foo
        {
            public void Print()
            {
                System.Console.WriteLine("Ns1.Foo");
            }
        }
    }
    
    namespace Ns1.Foo.Foo2
    {
        class Foo
        {
            public void Print()
            {
                System.Console.WriteLine("Ns1.Foo.Foo2");
            }
        }
    }
    
    namespace Ns1.Foo.Bar
    {
        class Bar
        {
            public void Print()
            {
                new Foo().Print();
            }
    
            static void Main()
            {
                new Bar().Print();
            }
        }
    }
    

    编辑:在命名空间inside 中添加 using 子句,将在完成当前命名空间的分层搜索之前搜索命名空间。将示例更改为:

    namespace Ns1.Foo.Bar
    {
        using Ns1.Foo.Foo2;
        class Bar
        {
            public void Print()
            {
                new Foo().Print();
            }
    
            static void Main()
            {
                new Bar().Print();
            }
        }
    }
    

    Ns1.Foo.Foo2 将被打印出来。

    编辑:更改示例

    【讨论】:

      【解决方案2】:

      您的代码在命名空间A.BA.B.C 中吗?如果是这样,那可能就是问题所在。使用这样的 using 指令:

      using TheTypeIWant = A.B.C.D.MyType;
      

      然后只需在您的代码中引用TheTypeIWant

      编辑:我刚刚尝试了“using MyType=A.B.C.D.MyType”选项,但是不起作用。不过上面的还不错。

      【讨论】:

      • 我认为这不适用于泛型类,对吧?
      • @WillIAm:如果您希望别名仍然是通用的,则不要,如果您明白我的意思。但回答提出的问题时,没有迹象表明涉及仿制药。带有使用泛型的具体示例的问题可能会导致不同的解决方案。
      【解决方案3】:

      只是猜测:在您的项目属性中,“默认命名空间”是否设置为 A.B ?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-26
        • 2010-11-15
        • 2012-12-18
        • 2012-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多