有谁知道为什么没有独立的C#预处理器?也许是因为C#的一些语法特性使得分别运行预处理器阶段变得更加困难?
答案 0 :(得分:2)
因为从未真正有过预处理器,并且通过#
前缀行公开的某些功能与编译器的其他部分交互。
#define SOME_VARIABLE
,#if
看起来像C / C ++预处理程序指令只不过是C#设计者的语法选择。
特别是这些"指令"与编译过程的其余部分不正交,例如ConditionalAttribute
将检查构建变量,以便在编译时包含或排除给定的调用。
答案 1 :(得分:1)
C#参考说:
虽然编译器没有单独的预处理器,但是本节中描述的指令将被处理,就像有一个指令一样。
由此我推断,将预处理器分离为单独的工具是可行的(从语言学的角度来看)。但是微软还没有做到这一点。
我可以想到两个原因:
在执行此操作时,Microsoft管理层可能看不到任何商业价值(对Microsoft)。
C#语言设计者可能想要阻止(他们所看到的)滥用C#预处理器。例如,(IMO)从C#中剥离条件编译代码对几乎每个人都是坏的,并且在非C#的源代码上使用C#预处理器可能是一个坏主意。
他们可能想避免给想要创建基于C#语法的新第三方语言的人免费“支持”。
(好吧 - 我不知道微软/ C#语言设计师实际是否持有这些观点。没有人这样做。但是,这些都是微软没有做到这一点的合理解释,而且合理的解释都是那些你无法“询问”的人可以得到无法解释的决定。)
我不太了解C#是否评论ConditionalAttribute等是否会导致问题。但是,似乎可以找到解决办法;例如预处理程序命令行选项,用于将#defines重新注入预处理的输出。