查询 C# 命名空间和使用

Query about C# namespaces and using

C# 新手关于使用 & 命名空间的问题:

using System;
using System.Data;

namespace Granite2 {
    class Class1 {
        System.Data.SqlClient.SqlConnection Conn1;
        SqlClient.SqlConnection Conn2;
    }
}

Conn1 行,毫不奇怪,可以正常编译。 Conn2 有错误 "The type or namespace 'SqlClient' can't be found".

这是为什么?我认为 "using System.Data" 意味着我可以在没有完整限定符的情况下引用 SqlClient。

我很困惑,因为我正在将 VB.NET 转换为 C#,并且命名空间在 VB.NET 中有效。显然我在这里没有意识到一些细微差别。

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

来自 C# 团队的 FAQ - 这样做的主要原因是防止命名空间名称之间的冲突。

想象一下 - 您的命名空间 X 可以有子命名空间 YZ 都声明了 SomeClass。因此,如果您将 using X 然后 SomeClass с = new SomeClass(); - 如果编译器将从 X.

的所有子名称空间导入所有类型,将会发生冲突