Tim*_*ter 9 c# compiler-construction types namespaces compiler-errors
我怀疑这是一个曾经多次被问过的问题,但我还没找到.
我通常使用完全限定的命名空间,如果我不经常在文件中使用该类型,或者我添加using namaspacename
在文件的顶部以便能够写入new ClassName()
.
但是,如果只添加了完整命名空间的一部分呢?为什么编译器找不到类型并抛出错误?
考虑嵌套命名空间中的以下类:
namespace ns_1
{
namespace ns_1_1
{
public class Foo { }
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我现在想要初始化此类的实例,它可以通过以下方式工作:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是以下不起作用:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
它会抛出编译器错误:
找不到类型或命名空间名称"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
{
//...
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:现在我知道为什么这对我来说似乎很奇怪.它在VB.NET中没有问题:
Imports System.Data
Public Class Program
Public Sub New()
Using con = New SqlClient.SqlConnection("...") ' no problem
End Using
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
不幸的是,这种明显的方式不起作用,但您可以通过别名命名空间来实现所有这些:
using ns_1_1 = ns_1.ns_1_1;
public class Program
{
public Program()
{
var no_foo = new ns_1_1.Foo();
}
}
Run Code Online (Sandbox Code Playgroud)
文档说:
创建 using 指令以使用命名空间中的类型,而无需指定命名空间。using 指令不允许您访问嵌套在您指定的命名空间中的任何命名空间。
因此,using
仅包括在指定命名空间中定义的类型(而不是命名空间)。为了访问嵌套命名空间的类型,您需要使用指令显式指定它,using
就像在第一个示例中所做的那样。
归档时间: |
|
查看次数: |
1094 次 |
最近记录: |