gpt4 book ai didi

c# - 除非使用嵌套使用 block ,否则 Visual Studio 无法解析类名

转载 作者:太空宇宙 更新时间:2023-11-03 19:26:50 24 4
gpt4 key购买 nike

我有一个名称与 namespace 相同的类包含在:

类文件ReadModel.cs

namespace App.Core.ReadModel
{
public class ReadModel
{
}
}

类文件MyClass.cs

using App.Core.ReadModel; // this does not work

namespace Something
{
// using App.Core.ReadModel (Works if I un-comment)

public class MyClass
{
public void test()
{
var x = new ReadModel();
}
}
}

当尝试实例化类时,即使尝试在顶部添加 using 指令,编译器仍然无法解析该类。但是,如果我将 using 语句嵌套在命名空间中,它就可以正常工作。

有人能解释一下为什么这样吗?这是我刚刚发现的一项新功能

错误是:App.Core.ReadModel 是一个命名空间,但像类型一样使用

最佳答案

两者的区别

using System  ;
using Foo.Bar ;

namespace My.Widget.Tools
{
public class MySpecialTool
{
...
}
}

using System ;

namespace My.Widget.Tools
{
using Foo.Bar ;

public class MySpecialTool
{
...
}
}

是在第一种情况下,指令 using Foo.Bar ; 导致 namespace Foo.Bar 中的对象被导入到未命名的(全局) namespace 中为编译单元。在第二种情况下,using 指令 将命名空间 Foo.Bar 中的对象导入命名空间 My.Widget.Tools。

差异与解析不合格引用的搜索顺序有关。

不合格的引用通过首先在封闭的命名空间内搜索来解决。如果未解析引用,则搜索编译单元的未命名(全局)命名空间。

考虑上述命名空间 Foo.Bar 包含一个与 System 命名空间中包含的类冲突的可见类的情况。

在第一种情况下,Foo.Bar 命名空间已经加载到全局命名空间中,如果您尝试引用冲突对象,您将收到关于不明确引用的错误:它将首先搜索封闭的命名空间,在找不到它,然后它会查看全局命名空间并找到多个对象并提示。

在第二种情况下,首先搜索封闭的命名空间,在找到所需名称的对象时,解析不合格的引用,编译器很高兴:没有冲突。

请注意,您可以通过使用 global:: prefix 限定对象引用来强制搜索顺序到全局命名空间.您还可以使用 using 指令为命名空间定义自己的别名:

using io = System.IO ;

或者对于一个类型:

using IntList = System.Collections.Generic.List<int> ;

为命名空间定义别名的注意事项是您必须使用别名来解析引用。为类型定义的别名只是为您提供了一种 [也许] 命名该类型的简写方式。对于泛型可能比其他任何东西都更有用。我认为做这样的事情没有多大值(value):

using Row = System.Data.DataRow ;

除了编写混淆的 C#。

另见这个问题:Should 'using' statements be inside or outside the namespace?

ISO/IEC 23270:2006 的第 16 节(信息技术 -- 编程语言 -- C#)将告诉您关于命名空间和 using 指令的更多信息。

另请参阅有关 namespace 别名的 MSDN 文章:http://msdn.microsoft.com/en-us/library/c3ay4x3d(v=vs.80).aspx

关于c# - 除非使用嵌套使用 block ,否则 Visual Studio 无法解析类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8001295/

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