查询 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
可以有子命名空间 Y
和 Z
都声明了 SomeClass
。因此,如果您将 using X
然后 SomeClass с = new SomeClass();
- 如果编译器将从 X
.
的所有子名称空间导入所有类型,将会发生冲突
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
可以有子命名空间 Y
和 Z
都声明了 SomeClass
。因此,如果您将 using X
然后 SomeClass с = new SomeClass();
- 如果编译器将从 X
.