5

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

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

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

有任何想法吗?

谢谢!

4

3 回答 3

10

您是否在 AB 命名空间下的命名空间中工作?(例如 ABX)如果是这样,C# 命名空间解析(ECMA-334 C# 语言规范:10.8 10.8 命名空间和类型名称)说:

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

然后是:

如果 K 为零并且命名空间声明包含将名称 I 与导入的命名空间或类型相关联的 extern-alias-directive 或 using-aliasdirective,则命名空间或类型名称引用该命名空间或类型

这意味着名称解析从当前命名空间开始,搜索直到根目录的所有命名空间,并且只有在这种分层搜索结束后,才会搜索使用该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被打印。

编辑:更改示例

于 2008-11-04T18:20:17.087 回答
6

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

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

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

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

于 2008-11-04T17:06:54.177 回答
0

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

于 2008-11-04T16:59:38.760 回答