查询C#名称空间和使用

查询C#名称空间和使用,c#,namespaces,C#,Namespaces,新手C#关于使用名称空间的问题(&N): using System; using System.Data; namespace Granite2 { class Class1 { System.Data.SqlClient.SqlConnection Conn1; SqlClient.SqlConnection Conn2; } } 毫不奇怪,Conn1行编译得很好。Conn2有一个错误“找不到类型或命名空间'SqlClient' 为什么会这样

新手C#关于使用名称空间的问题(&N):

using System;
using System.Data;

namespace Granite2 {
    class Class1 {
        System.Data.SqlClient.SqlConnection Conn1;
        SqlClient.SqlConnection Conn2;
    }
}
毫不奇怪,Conn1行编译得很好。Conn2有一个错误“找不到类型或命名空间'SqlClient'

为什么会这样?我认为如果有“usingsystem.Data”,就意味着我可以在没有完整限定符的情况下引用SqlClient

我很困惑,因为我正在将VB.NET转换为C#,并且名称空间在VB.NET中工作。显然,这里有一些细微差别我不知道。

这是因为C#编译器只导入您指定的名称空间中的类型(针对您的特定情况
System.Data
),而不是从它的所有子名称空间(因此在您的情况下
System.Data.SqlClient
名称空间类型未导入)

从C#team开始,这样做的主要原因是防止名称空间名称之间的冲突


想象一下,您的命名空间
X
可以有子命名空间
Y
Z
都声明了
SomeClass
。因此,如果您将
使用X
,然后
SomeClassС=new SomeClass()-如果编译器将从
X

的所有子命名空间中导入所有类型,则会发生冲突。如果类
Class1
位于命名空间
System.Data
中,则无需指定完整命名空间,但上面的情况除外。此处的情况并非如此。感谢您的参考-有一条评论说VB.NET具有导入子命名空间的行为,这解释了差异。尽管这条评论很旧,但在VS2013中,VB.NET的情况似乎仍然如此