C# using指令深度

8

我正在尝试理解C#中的using指令...为什么这样可以工作...

using System;
using System.ComponentModel.DataAnnotations;
namespace BusinessRuleDemo
{
    class MyBusinessClass
    {
        [Required]
        public string SomeRequiredProperty { get; set; }
    }
}

但是这个不行吗?
using System;
using System.ComponentModel;
namespace BusinessRuleDemo
{
    class MyBusinessClass
    {
        [DataAnnotations.Required]
        public string SomeRequiredProperty { get; set; }
    }
}

第二个错误会导致编译错误:“类型或命名空间DataAnnotations找不到。您是否缺少using指令或程序集引用?”

尝试使用[System.ComponentModel.DataAnnotations.Required] - Can Poyrazoğlu
2
我认为他的问题是为什么不能通过缩写并继续利用由using开始但未完成的命名空间。 - James Michael Hare
2个回答

7
使用using指令可以让你从指定的命名空间中使用类名作为参数。由于DataAnnotations不是一个类,而是一个命名空间,在第二种情况下无法访问它。你应该使用完全限定的类名NS1.NS2.Class1,或者以using NS1.NS2;的形式开始你的程序,然后使用Class1。

我会接受这个答案,但是我想编译器错误应该是“找不到类型DataAnnotations”,而不是“找不到类型或命名空间DataAnnotations”。正如你所说,DataAnnotations是一个命名空间,那么为什么编译器会说找不到DataAnnotations命名空间呢? - Shawn de Wet
@Shawn de Wet:实际上这些是C#编译器的实现细节。我的答案只是正确的。至于编译器消息,我无法确定。 - Andrey Agibalov
1
@Shawn,编译器的警告是正确的。在C#编译器中,命名空间始终是完全限定的,因此它告诉您不存在名为“DataAnnotations”的命名空间。而且确实没有名为“DataAnnotations”的命名空间,只有“System.ComponentModel.DataAnnotations”。 - JSBձոգչ
1
@Shawn 编译器在这里有些棘手:它确实找不到 DataAnnotations 作为类型或命名空间。问题在于它将搜索当前命名空间以及由 using 指定的任何命名空间中的类名,但仅会在当前命名空间中“搜索”其他命名空间(因为实际命名空间是完全限定的)。因此,一旦您意识到每个分类的搜索空间是什么,该错误就是技术上正确的。 - dlev
@JSBangs: 你很棒!是的,它只是指全局的DataAnnotations命名空间,而不是嵌套的那个。 - Andrey Agibalov

1

因为您可以使用完全限定类名,也可以只使用类名,并通过using指令让.NET解析它。没有中间地带。

Class1 -

NameSpace1.NameSpace2.NameSpace3.Class1

可以被访问为

using NameSpace1.NameSpace2.NameSpace3;
...
... Class1.DoSomething();
...

或者

...
NameSpace1.NameSpace2.NameSpace3.Class1.DoSomething();
...

但不是像这样的

using NameSpace1.NameSpace2;
...
NameSpace3.Class1.DoSomething();
...

在最后一种情况下,编译器实际上要查找的是根命名空间NameSpace3,而这个命名空间显然不存在。它不会尝试查找System.NameSpace3NameSpace1.NameSpace3NameSpace1.NameSpace2.NameSpace3等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接