【问题标题】:C# why code compiles without any name spaces includedC# 为什么代码编译时不包含任何名称空间
【发布时间】:2011-09-30 15:48:40
【问题描述】:

我尝试了以下

// no using statements here, not even using System;

class Program
{
    static void Main(string[] args)
    {
        string[] arr = new string[3] { "A" , "B", "C" };
    }             
}

我的问题很简单,即使没有任何 using 语句,编译器如何能够编译它,更具体地说,不应该出现编译时错误,因为我正在尝试构建一个数组并且 System.Array 不可访问?

谢谢。

【问题讨论】:

  • 如果你使用String而不是string你会得到你期望的错误。
  • @Henk Holterman:他会收到一个错误,但我认为这不是他所期望的。

标签: c#


【解决方案1】:

您似乎对using 的含义有误解。 using 指令用于在编译时确定简单名称在您的程序中的含义。当您说using Foo; 时,它的意思是“如果该程序的文本 使用简单的名称Bar,并且似乎没有任何名为Bar 的名称在使用该名称的范围内然后尝试检查命名空间Foo内是否有一个名为Bar的类型。

您的程序不包含任何简单的名称! (string 不是一个简单的名称;它是语言的关键字。)因此不需要任何using 指令来解析不存在的简单名称。

using 根本不意味着“此程序使用需要在此程序集中找到的类型的功能”,这似乎是您认为的意思。 using 指令仅涉及 (1) 简单名称解析和 (2) 扩展方法名称解析。

【讨论】:

    【解决方案2】:

    数组是语言的一部分。您无需引用命名空间即可使用它们。

    【讨论】:

      【解决方案3】:

      string[] 将在编译时转换为 System.Array。由于它已经完全合格,因此不需要任何 using 语句。

      【讨论】:

        【解决方案4】:

        您指的不是任何命名空间类型,而是您的(Program 类)。

        string[] 是确实分别等同于 System.StringSystem.Array 的别名,但使用它们不需要将它们对应的命名空间拉入作用域。

        【讨论】:

          【解决方案5】:

          您没有直接引用Array 类或其成员,因此编译器不会抱怨您尝试引用未使用的命名空间或类型。您只是使用 C# 语言本身的符号来制作数组。

          【讨论】:

          • 我认为这不是问题。
          • System.String 怎么样,它是如何访问的?我将鼠标悬停在语句中的 string[] 部分上,它显示“class System.String”
          • @Amit: string 是一个关键字,就像[] 是语言的一部分,所以同样的原因。
          • @Amit,它是语言的一部分,是核心功能。
          【解决方案6】:

          这是因为你使用的是核心的东西,你甚至不需要System 来编译它。 System 命名空间具有扩展功能,系统命名空间中包含的一些类是:

          由于您没有尝试向命令提示符写入内容、创建操作甚至使用DateTime 询问日期,因此您无需导入任何内容。

          【讨论】:

            【解决方案7】:

            using 语句不包含任何内容或提供任何 ekstra 代码。它只会让代码更简单,因为您不必每次都编写整个路径。

            string 自动转换为 System.String。

            你可以这样写:

            class Foo {
                string Bar() {
                    return System.IO.File.Exists("path").ToString();
                }
            }
            

            或者只是

            using System.IO;
            class Foo {
                string Bar() {
                    return File.Exists("path").ToString();
                }
            }
            

            两者都编译成同一个程序。

            【讨论】:

            • 他在问为什么代码编译时没有使用,即使他正在制作一个字符串数组。
            【解决方案8】:

            命名空间不是必需的,您可以使用命名空间组织您的代码,但您不必这样做。 并且常用关键字会自动引用到正确的命名空间。

            为了更好地理解,请阅读此 msdna 文档http://msdn.microsoft.com/en-us/library/ms973231.aspx

            【讨论】:

              猜你喜欢
              • 2022-12-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-01-19
              • 1970-01-01
              • 2010-10-24
              • 1970-01-01
              • 2016-01-17
              相关资源
              最近更新 更多