Visual Studio中的语法错误和编译器错误,红色波浪线与蓝色波浪线的区别

13
作为Visual Studio看到的,“语法错误”和“编译器错误”的区别是什么?换句话说,为什么有些“编译时”错误会被下划线标为红色波浪线,而有些则是蓝色波浪线?以下是一个例子:

enter image description here

上面红色下划线的错误描述如下:

方法“ValidateFilteredRecipient”的重载方法不接受6个参数。

蓝色下划线的错误描述如下:

'ValidateBuild': 无法在静态类中声明实例成员。

我不清楚这两个错误的区别。

我原以为找到答案会很容易:只需在谷歌上搜索,第一个结果就是MSDN页面详细阐述此主题;然而,令人惊讶的是,事实并非如此。我开始尝试谷歌颜色(因为我还不知道红色表示“语法错误”,蓝色表示“编译器错误”):

visual studio red underline vs. blue underline

没有任何帮助。然后我尝试了以下搜索:

Visual Studio错误下划线颜色的含义
Visual Studio下划线颜色的含义

我看到这个问题无法解决,于是进行了更多谷歌搜索,找到了VS中设置颜色的位置:工具 > 选项 > 环境 > 字体和颜色。顺便说一句,在这里无法搜索巨大的列表非常令人恼火,但我发现“语法错误”有红色波浪线,“编译器错误”有蓝色波浪线。

enter image description here

那这些是什么意思?回到谷歌搜索:

Visual Studio编译器错误与语法错误

没有相关内容。这是我在MSDN上找到的最接近的内容:

字体和颜色,环境,选项对话框

这个页面有以下条目:

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

以及

语法错误--解析错误。

不太有用--强调"完全没用"。我一直认为自己知道"语法错误"是什么,至少维基百科也这样认为:

语法错误是指在特定编程语言中编写的一系列字符或标记的句法中存在错误。

另外,这里是语法的定义

计算机语言的语法是一组规则,定义了在该语言中被视为正确结构化文档或片段的符号组合。

那么,回到我上面提到的"语法错误":

No overload for method 'ValidateFilteredRecipient' takes 6 arguments

根据我在这里包含的定义,这是一个语法错误吗?实际上,在我看来,我得到的"编译器错误"更接近于这个语法错误的定义:

'ValidateBuild': cannot declare instance members in a static class

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


对于一个非常好的问题,我有些勉强地点了个赞,但当我意识到你正在深入研究的内容时,它也有点像一个冗长的故事。红色波浪线,蓝色波浪线,我们不能和平相处吗? - Jeroen Mostert
@JeroenMostert - 我完全理解。但是这难道不让你感到困扰吗?我是说,这是一个商业级别的IDE......至少为了解决一个谜题,为什么它们不只是一种错误类型呢?而且为什么没有文档记录它们呢? - rory.ap
1
哦,我真想知道为什么我被踩了。说真的?如果这是一个“没用”的东西,那么微软为什么要区分颜色呢?显然微软认为这样做很有用。 - rory.ap
这是一个好问题。我喜欢你添加了实际链接到你的谷歌搜索中。 - Jonesopolis
1
有趣的是,在我的情况下,我看到两种类型错误都有红色下划线。我实际上不记得上一次看到蓝色下划线是什么时候了 :) 或许是因为Resharper... - Evk
显示剩余6条评论
2个回答

4

语法错误和编译器错误会导致您的代码无法编译。

语法错误是指您的代码与其他代码的交互方式。例如,将参数传递给函数时出现类型不匹配等问题。

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


我完全同意你的看法。我只是感到困惑,微软为什么要在一开始区分这两个东西,然后在实现上失误了。 - rory.ap
1
顺便说一句:我理解你的观点,你编写的所有代码都需要遵循语言的语法规则,否则它将无法编译。我认为正在进行的区分是定义语法(声明类和方法 - 导致编译器错误)与实现语法(方法内部的内容 - 导致语法错误)之间的区别。 - Theo
1
生成良好的语法错误消息非常棘手。解析器根本不知道您想要做什么,只能猜测您的意图。“没有重载方法”并不是一个可怕的消息,但它不知道这个代码是否有错或方法声明是否有误。编译器错误要容易得多,它确切地知道您做错了什么。顺便提一下,C#编译器生成的语法错误消息非常好,他们付出了很多关注。 - Hans Passant
@HansPassant - 真的吗? 在rory的例子中,他们是想把类设为非静态还是成员设为静态? - Damien_The_Unbeliever
2
真的。没有人会意外地声明一个类为静态 - Hans Passant
显示剩余3条评论

2
语法错误和编译错误的主要区别在于Visual Studio检测到它们的时间不同。
编写代码时,语法错误会被检测并突出显示。您无需构建代码即可获取这些错误。
然而,编译错误比较复杂,编辑器不能在您编写代码时检测到它们。您必须通过编译器运行代码(进行构建)才能识别它们。因此,有可能继续编写代码而没有编译,直到构建代码后才能检测到这些错误。
基本上,语法错误是编译错误的一个子集。如果您使用像记事本这样的文本编辑器编写代码,您将永远看不到语法错误。当您通过编译器运行代码时,所有错误都将记录为编译错误。
关于以不同方式突出显示它们,我认为这是为了让开发人员理解他在编写代码时本可以捕获到这些错误的一种视觉表示。
正如每个人所提到的,最终,您需要修复两者才能使代码运行。
对于任何编程语言和与该语言一起使用的编辑器都是如此。

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