我怀疑这是一个经常被问到的问题,但我没有找到答案。
如果我在文件中很少使用某个类型,我通常会使用完全限定的命名空间或在文件顶部添加using namaspacename
以便写出new ClassName()
。
但是如果只添加了命名空间的一部分呢?为什么编译器找不到该类型并抛出错误?
考虑以下嵌套命名空间中的类:
namespace ns_1
{
namespace ns_1_1
{
public class Foo { }
}
}
所以现在如果我想初始化这个类的一个实例,它可以按以下方式工作:
using ns_1.ns_1_1;
public class Program
{
public Program()
{
// works, fully qualified namespace:
var foo = new ns_1.ns_1_1.Foo();
// works, because of using ns_1.ns_1_1:
foo = new Foo();
}
}
但是以下方法不起作用:
using ns_1;
public class Program
{
public Program()
{
// doesn't work even if using ns_1 was added
var no_foo = new ns_1_1.Foo();
}
}
它抛出编译器错误:
找不到类型或命名空间名称“ns_1_1”(是否缺少 using 指令或程序集引用?)。
我认为这是因为 ns_1_1
被视为包含另一个类 Foo
的类,而不是一个命名空间,这样是正确的吗?
我还没有找到语言规范,这在哪里记录?为什么编译器不能智能地检查是否存在类或命名空间(部分)?
以下是另一个更具体的示例:
using System.Data;
public class Program
{
public Program()
{
using (var con = new SqlClient.SqlConnection("...")) // doesn't work
{
//...
}
}
}
编辑: 现在我知道为什么这对我来说看起来非常奇怪了。在VB.NET中,它可以毫无问题地工作:
Imports System.Data
Public Class Program
Public Sub New()
Using con = New SqlClient.SqlConnection("...") ' no problem
End Using
End Sub
End Class