gpt4 book ai didi

c# - 命名空间冲突

转载 作者:太空狗 更新时间:2023-10-30 00:13:27 25 4
gpt4 key购买 nike

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

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

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

有什么想法吗?

谢谢!

最佳答案

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

... for each namespace N, starting with the namespace in which the namespace-or-typename occurs, continuing with each enclosing namespace (if any), and ending with the global namespace, the following steps are evaluated until an entity is located...

然后是:

If K is zero and the namespace declaration contains an extern-alias-directive or using-aliasdirective that associates the name I with an imported namespace or type, then the namespace-or-type-name refers to that namespace or type

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

编辑:更改示例

关于c# - 命名空间冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/262469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com