System.Collections是"System名称空间的名称空间"吗?

Fro*_*raw 25 .net c# namespaces

好的,所以我一直在读一本关于C#和.NET的书,同时学习DateTime结构和以下代码:

DateTime dt = new DateTime(2015, 10, 17);
Run Code Online (Sandbox Code Playgroud)

我问自己"为什么我不必通过写作在顶部引用它using System.DateTime"?

因此,我意识到,由于日期时间是一个结构,而"使用"关键字用于引用类型(类型是一个通用术语,是指从集合{类,接口,结构,枚举,委托}为成员)中所定义特定命名空间(在本例中,DateTime是System Namespace中的类型结构).

但是我注意到在我文件的顶部,找到了以下using指令(当我创建C#控制台应用程序时它们会自动放在那里):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
Run Code Online (Sandbox Code Playgroud)

我想知道为什么后面的using指令using System是必要的,什么时候它们都不在System命名空间下,因此它们应该已被引用?

所以我猜它是因为它下面声明的所有都是名称空间,而不是来自集合{class,interface,structure,enumeration,delegate}的类型.然而这是错误的,称他们为"(或属于)的命名系统命名空间,"如果是这样,那是什么,你必须明确地引用命名空间,而不是他们的下隐含地包括命名空间的原因using System

我希望我的问题很明确,但如果没有,请告诉我,以便我可以编辑.

Ste*_*per 24

在内部,所有.net类型始终具有完整的类型名称;

System.DateTime
System.Collections.Generic.Dictionary<string, int>
System.Threading.Tasks.Task
Run Code Online (Sandbox Code Playgroud)

'使用'做的是让你在''之前'无形地'引用一切.字符.所以当你写作

DateTime
Run Code Online (Sandbox Code Playgroud)

C#会试试

System.DateTime
System.Collections.Generic.DateTime
System.Linq.DateTime
System.Text.DateTime
etc...
Run Code Online (Sandbox Code Playgroud)

因为只有一个存在(System.DateTime)它是一个明确的匹配,而C#知道你在说什么.

如果有两个匹配项,则会出现关于歧义的编译器错误.因此,如果有一个System.Threading.Task.DateTime,你的程序将不会编译.

所有这些都为你的问题的答案设定了场景.如果

using System;
Run Code Online (Sandbox Code Playgroud)

包括它下面的一切,然后很难确保事情不含糊.例如,如果您想区分两个理论类

System.WebPages.Button
System.Desktop.Button
Run Code Online (Sandbox Code Playgroud)

然后一个普通的老人using System不会玩得很好new Button().