Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C#中的内置类型是语言关键字?_C#_Language Design_Keyword - Fatal编程技术网

为什么C#中的内置类型是语言关键字?

为什么C#中的内置类型是语言关键字?,c#,language-design,keyword,C#,Language Design,Keyword,在C#中,诸如int或string等标识符实际上是语言级别的关键字。 原因是什么 请注意,如果作者想要禁止使用这些名称的用户类型,那么可能会导致语义错误,而不是语法错误 基于回答的一些澄清: 它们是关键字,因为它使解析成为可能/更容易 我不明白为什么,因为我正在开发一个解析器,而拥有Type.Rule=Identifier比Type.Rule=Identifier |“int”|“string”|……简单得多 它们是关键字,因为它们是特殊别名 var和dynamic也是特殊的东西,但不是关键字(

在C#中,诸如
int
string
等标识符实际上是语言级别的关键字。
原因是什么

请注意,如果作者想要禁止使用这些名称的用户类型,那么可能会导致语义错误,而不是语法错误

基于回答的一些澄清:

  • 它们是关键字,因为它使解析成为可能/更容易
    我不明白为什么,因为我正在开发一个解析器,而拥有
    Type.Rule=Identifier
    Type.Rule=Identifier |“int”|“string”|……
    简单得多

  • 它们是关键字,因为它们是特殊别名
    var
    dynamic
    也是特殊的东西,但不是关键字(出于兼容性的原因,它表明作为关键字并不一定是特殊的)。在另一个示例中,将
    [Serializable]
    应用于类型会生成magic IL元数据修饰符
    Serializable
    ,而不是标准的自定义属性。但它仍然不是一个关键词

  • 它们是关键字,因为它们是其他语言中的关键字
    答案很好,但是,为什么它们是其他语言中的关键词呢?而且,当然可以用蓝色突出显示它们,而不用它们作为关键字,那么为什么要从其他语言引入它们呢


  • 这是因为
    int
    和C#语言中内置的其他特殊值类型实际上根本不是类型,而是类型

    这是一个语法错误而不是语义错误,原因很简单,因为这些错误是在语法错误检测阶段检测到的,而语法错误检测阶段发生在语义错误检测阶段之前。语法错误检测具有确定
    int
    是用作类型还是用作其他内容所需的所有信息。假设我们有以下规则:

    声明=类型标识符

    语法阶段检查标识符是否为[a-Z]([a-Z]+|[0-9]+)+并且不是保留关键字或别名,在您描述的情况下,它是保留关键字或别名。因此,将其命名为语法错误是完全有意义的。

    据我所知,C#设计人员希望允许使用C风格语言中常见的典型类型名称,即
    string
    int
    ,等等。同时,这些类型中的每一个都必须具有完整的限定类型名,例如
    System.String
    System.Int32
    。因此,决定为这些常用类型提供别名

    如果我再次找到此语句的源代码,我将添加链接

    在其他基于CLI的语言中,相同的完全限定类型标识符是有效的。但是,诸如
    int
    string
    之类的类型名称在此类语言中可能并不常见,因此可能会提供其他别名


    使用类型别名的一个可能的优点是提高了可读性,这就是为什么存在一种强制使用别名而不是常规类型名的方法。关于简洁的观点也在同一个话题中提到。

    几乎是我所学的语言:C、C++、java、Pascal、C。我真的不确定,但根据我在大学里学过的

    编译器设计
    课程(在这门课程中,我们将学习人们如何一步一步地编写编译器,并实现自己的编译器),你提出这个问题的主要原因是:为了更容易词法分析短语

    当你编码时,所有的代码都是一个简单的字符串。在真正编译之前,编译器必须完成许多短语

    例如,键入时:

    inta=5

    第一个短语是词法分析,必须提供一个如下所示的词典,并发送到解析器pharse

        int ---> identifiers
        a   ---> Variable
        =   ---> Operator(=)
        5   ---> Integer
        ;   ---> ;
    
    词法分析如何知道这一点:首先,它将建立一个字典表并搜索您输入的字符串。当第一个标记器相遇时,它将停止并获取该标记器。(这很重要!)

    字典是这样写的:

    if   ---> if
    then ---> then
    int  ---> int
    .... // all keywords here
    [a-z][a-z0-9_]* ---> variable  // example of regular expression :  I don't sure it's true, just something like this :D
    
    因此,如果语言允许您像变量一样命名int。例如:

    int=5

    上面的
    词法分析方法是错误的,当它读取第二个
    int
    时,它不知道它是一个变量或关键字,必须有更复杂的步骤来确定它

    我不是说它不能,但是编译时它更复杂,速度也更慢,而且不需要。只需对程序员说:“嘿,不要这样做,否则,我不会编译你的程序:)”


    希望这有帮助:

    这是许多相似语言(C,C++,java,仅举几个名字)的例子。这有什么关系?@GSerg:这没什么关系。它解释了如何绕过语言级关键字,但没有回答当前关于这些关键字背后的基本原理的问题。正如@OliCharlesworth所说,以这种方式设计语言是很常见的。。。然而,我认为这是一个非常有趣的问题+1:)@HansPassant是的。我认为C#的
    int
    在50年后仍将是32位,
    long
    仍将是64位。然后128位为
    xlong
    (超长),256位为
    vxlong
    (超长)ツ实际上,
    var
    dynamic
    是上下文关键字,
    string
    int
    是保留关键字。上下文关键字和保留关键字之间的主要区别在于后者不能用作标识符。我认为这并不能真正回答问题。在许多其他语言中,内置类型也是关键字,但它们不是.NET系统类型的别名。对于第二部分,您实际上只是重复了这个问题:“这是一个语法错误,因为它是在语法错误检测阶段检测到的”。没有解释为什么它是这样设计的。:)但是循环推理是有效的!嗯,现在我又读了一遍,它看起来确实有点圆,呜