【发布时间】:2014-09-23 13:55:47
【问题描述】:
我怀疑这是一个以前被问过很多次但我还没有找到的问题。
如果我不经常在文件中使用该类型,或者我在文件顶部添加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 而不是命名空间的类,这是正确的吗?
我还没有找到语言规范,这是在哪里记录的?为什么编译器不够聪明,无法检查是否存在类或命名空间(-part)?
这是另一个不太抽象的例子:
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
【问题讨论】:
标签: c# types compiler-construction compiler-errors namespaces