为啥#region 会产生编译错误?
Posted
技术标签:
【中文标题】为啥#region 会产生编译错误?【英文标题】:Why does #region create compiling errors?为什么#region 会产生编译错误? 【发布时间】:2015-10-26 19:54:56 【问题描述】:为什么非关闭 #region
会导致编译器错误?毕竟,区域本身对编译后的代码绝对没有影响,对吧?
我相信这是因为它是一个预处理器指令,但这是为什么呢?毕竟它不像其他指令那样使用。
class Application
#region Whatever <- Causes an error.
static void Main(string[] c)
为什么不能忽略它?或者有什么我不知道的关于 #region
的功能解释了它为什么被编译?
编辑:我知道这个例子没有编译,因为没有对应的#endregion
。但它不应该被视为 xml 注释中缺少的结束标记吗?我的意思是,它具有同样的重要性,不是吗?
第二次编辑:我希望了解使 #region
成为预处理器指令背后的设计决策。为什么不只是一种 IDE 会识别为可以折叠的代码区域的注释?
【问题讨论】:
它无法编译,因为预处理器期望某些东西在那里,但它找不到它,所以它出错了。你是对的,它没有修改代码,但是预处理器需要看到匹配的结束标记。 不,预处理指令的重要性与不匹配的 xml 注释标记非常不同。 @jrummell 实际上,在我看来,反之亦然。 但是 为什么 是预处理器,即使考虑到#region
标记,为什么它被创建为预处理器指令,而不仅仅是另一种注释?
我没有一个好的答案,除了微软决定将其作为预处理器指令。我也很好奇。 msdn.microsoft.com/en-us/library/9a1ybwek.aspx
【参考方案1】:
为什么不关闭的#region 会导致编译器错误?
因为specs 这么说。
#region 块必须以 #endregion 指令终止。
是的,它们不会成为编译程序的一部分,但其他预处理器指令可以定义程序的一部分,例如#if DEBUG
(包括一些东西)。
2.5 Pre-processing directives
预处理指令不是令牌,也不属于 C#的句法语法。 但是,预处理指令可以 用于包含或排除标记序列,并且可以以这种方式 影响 C# 程序的含义。
对于您的问题:
但是为什么预处理器甚至考虑#region标签,为什么 它创建为预处理器指令,而不仅仅是另一种 评论?
区域对于 IDE (Visual Studio) 目的很有帮助,(如果不是不可能的话) 要实现没有区域的折叠/扩展代码的相同功能将非常困难。 (这是我的猜测,只有微软开发团队的成员才能回答这个问题)
Region directive:
一个区域没有附加语义; 区域旨在 供程序员或自动化工具使用来标记 源代码。 #region 或 #endregion 中指定的消息 指令同样没有语义意义;它只是用来 识别区域。匹配 #region 和 #endregion 指令可能 有不同的 pp 消息。
【讨论】:
以上是关于为啥#region 会产生编译错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用“if-else”语句会在看似相同的三元运算符构造不会产生 TypeScript 编译器错误?
为啥这个私有模板函数会编译? -> 编译器错误 VS 2009