代码之家  ›  专栏  ›  技术社区  ›  Chris

命名空间冲突

  •  4
  • Chris  · 技术社区  · 16 年前

    在这种情况下,.NET如何找到错误的“mytype”?

    在我正在处理的项目中,我有一个A.B.C.D.MyType类型,并且我引用了一个具有A.B.MyType类型的dll?我的代码中没有任何“using a.b;”语句,也没有“using a.b.c.d;”。当我编译时,编译器认为任何对“mytype”的裸引用都意味着“a.b.mytype”。

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

    有什么想法吗?

    谢谢!

    3 回复  |  直到 16 年前
        1
  •  8
  •   Pop Catalin    16 年前

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

    …对于每个命名空间n,从 其中的命名空间 出现命名空间或类型名, 继续每封信 命名空间(如果有),结尾为 全局命名空间,如下 在实体 位于。。。

    然后是:

    如果k为零且命名空间为 声明包含 外部别名指令或 使用与 带有导入命名空间的名称i 或键入,然后 名称空间或类型名称引用该名称 命名空间或类型

    这意味着名称解析从当前名称空间开始并搜索到根目录下的所有名称空间,并且只有在层次搜索结束后,才使用 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();
            }
        }
    }
    

    编辑:添加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
  •  3
  •   Jon Skeet    16 年前

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

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

    那就参考一下 TheTypeIWant 在您的代码中。

    编辑:我刚试过 using MyType=A.B.C.D.MyType “选项,但是 工作。不过,上述情况还可以。

        3
  •  0
  •   Martin    16 年前

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