【问题标题】:Syntax error versus compiler error in Visual Studio, or red wavy underline versus blue wavy underlineVisual Studio 中的语法错误与编译器错误,或红色波浪下划线与蓝色波浪下划线
【发布时间】:2017-03-25 20:13:35
【问题描述】:

Visual Studio 看到的“语法错误”和“编译器错误”有什么区别?或者,换一种说法,为什么有些“编译时”错误用 red 波浪线下划线,而有些用 blue 波浪线下划线?这是一个例子:

上面红色下划线的错误有这样的描述:

方法 'ValidateFilteredRecipient' 没有重载需要 6 个参数

蓝色下划线的错误有这样的描述:

'ValidateBuild':不能在静态类中声明实例成员

我不清楚这两个错误的区别特征是什么。

我认为找到答案将是小菜一碟:我只是用谷歌搜索,第一个结果将是一个 MSDN 页面,充分阐述了这个主题;然而,非常令人惊讶的是,事实并非如此。我开始尝试用谷歌搜索颜色(因为我还不知道红色表示“语法错误”而蓝色表示“编译器错误”):

visual studio red underline vs. blue underline

那里没有帮助。然后我尝试了这些搜索:

visual studio error underline color meanings
visual studio underline color meanings

我可以看到这无济于事,所以我搜索了更多内容并找出了在 VS 中设置颜色的位置:工具 > 选项 > 环境 > 字体和颜色。顺便说一句,无法在此处搜索庞大的列表非常烦人,但我发现“语法错误”带有红色波浪下划线,而“编译器错误”带有蓝色波浪下划线。

那么这些是什么意思?返回谷歌:

visual studio compiler error vs. syntax error

没有什么相关的。这是我从 MSDN 找到的最接近的:

Fonts and Colors, Environment, Options Dialog Box

此页面包含以下条目:

编译器错误 -- 编辑器中的蓝色波浪线表示编译器错误。

语法错误 -- 解析错误。

一点帮助都没有——强调“根本”。我一直认为我至少知道什么是“语法错误”,Wikipedia 同意:

语法错误是字符序列的语法错误 或旨在以特定程序编写的令牌 语言。

另外,here is what what it has for syntax:

计算机语言的语法是定义 被认为是正确的符号组合 该语言的结构化文档或片段。

所以,从上面回到我的“语法错误”:

方法 'ValidateFilteredRecipient' 没有重载需要 6 个参数

根据我在此处包含的定义,这是一个语法错误吗?实际上,在我看来,我得到的“编译器错误”更符合语法错误的定义:

'ValidateBuild':不能在静态类中声明实例成员

有人可以帮我解决这个问题吗?

【问题讨论】:

  • @AlfieGoodacre --“你不能做的事情,或者编译器不允许你做的事情”
  • 不情愿地为一个很好地组合在一起的问题投票,但当我确切地意识到你正在深入研究什么时,这也是一个有点毛茸茸的狗故事。红色波浪线,蓝色波浪线,我们不能相处融洽吗?
  • @JeroenMostert -- 我完全理解。但它不会打扰你吗?我的意思是,这是一个商业的、企业级的 IDE……为了解决一个难题,至少……为什么它们不只是一种错误类型?为什么没有记录?
  • 天哪,我很想知道为什么我投了反对票。严重地?如果这是一个“没用”的东西,那么 MS 为什么会费心区分颜色呢?显然 MS 认为这样做很有用。
  • 有趣的是,在我的情况下,我看到这两种错误都有红色下划线。我实际上不记得上次我是什么时候看到蓝色下划线的 :) 可能是因为 Resharper...

标签: c# .net visual-studio compiler-errors syntax-error


【解决方案1】:

语法错误和编译错误的主要区别在于 Visual Studio 检测到它的时间。

在您编码时检测到语法错误并突出显示。您不必构建代码来获取这些错误。

但是,编译错误很复杂,编辑器在您编写代码时无法检测到。您必须通过编译器运行它(进行构建)以识别它们。因此,有可能最终在不编译的情况下继续编码,并且在构建之前无法检测到它们。

基本上,语法错误是编译错误的一个子集。如果您使用记事本等文本编辑器编写代码,您将永远不会看到语法错误。当您通过编译器运行代码时,所有这些都将记录为编译错误。

关于以不同方式突出显示它们,我认为这是一种视觉表示,让开发人员了解他在编写代码时可能会发现什么。

正如大家所说,归根结底,您需要同时修复这两个问题才能使代码运行。

这适用于任何编程语言以及与该语言一起使用的编辑器。

【讨论】:

    【解决方案2】:

    语法和编译器错误都会阻止您的代码编译。

    语法错误是指您的代码与其他代码片段的交互方式。将参数传递给函数等时类型不匹配之类的事情。

    另一方面,编译器错误指的是更基本的架构违规,例如尝试从密封类继承或在静态类中定义非静态成员。这些违背了语言的定义,而不是语言的使用。

    【讨论】:

    • "这些违反了语言的定义" -- 这不是语言的语法吗?
    • 我认为需要区分这两种类型的错误——无论你称其为语法错误还是其他语义错误。 IMO 语法错误只是不同类别的编译器错误。
    • 顺便说一句:我明白您的意思:您编写的所有代码都需要遵守该语言的语法,否则将无法编译。我相信正在做出的区别在于定义语法(声明类和方法 - 导致编译器错误)与实现语法(方法内的东西 - 导致语法错误)
    • 为语法错误生成一个好的错误消息是相当棘手的。解析器根本不了解您想要做什么,并且必须猜测预期的内容。 “方法没有重载”不是一个可怕的消息,但它不知道 this 代码是否错误或方法声明错误。编译器错误要容易得多,它可以 100% 地知道你做错了什么。 Fwiw,C# 编译器生成的语法错误消息非常好,他们对它们给予了很多的关注。
    • 真的。没有人不小心声明了一个类static
    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 2021-10-05
    • 2011-03-15
    • 2022-12-07
    • 2018-01-16
    • 2017-03-01
    • 2013-05-22
    相关资源
    最近更新 更多