C#代码可以以编译器(或语言)版本为条件吗?

时间:2015-11-19 17:35:29

标签: c# visual-studio-2010 visual-studio-2013 code-analysis

我想知道是否可以根据编译器版本使任意C#代码成为条件。特别是,我想在MSVS 2010 C#编译器中抑制代码分析警告,我知道2013编译器没有这样做;我想这样做逐个案例,因此可能在源代码中。

相关问题

示例问题

虽然对此问题感兴趣,但我真的想要一般答案

MSVS 2010给出了关于字符串文字中类名的CA2204(“更正拼写...”)警告,而2013让我通过自定义词典中的<Compound>元素消除了这一点。 2010年的文档表明它只支持元素<Dictionary> — <Words> — <Recognized> — <Word>(但使用包括<Compound>的字典似乎没有问题。)

我在MSVS 2013(其中各种检查更好)中部分编程和测试,部分在2010年(在我们最好的测试服务器上)。我有两个编译器的项目定义。理想情况下,我希望2010年能够及时发现问题,而不是等到2013年编译,所以我想尽可能少地压制,而不是在项目中全面压制CA2204。

因此,我考虑将[CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA2204…"…]属性包含在类似#if !MSVS2013之类的内容中,但似乎没有这样的功能测试可行。

可能的解决方案

在令人满意的顺序中,我考虑了以下内容,并且有兴趣听听别人认为最有效的内容:

  • (我没有发现简单可靠的东西)这就是我所希望的!
  • 在MSVS项目中抑制CA2204。 轻松但彻底。
  • 在MSVS项目中为至少该级别的任何编译器手动定义宏MSVS2013并按上述方式进行抑制。 有点尴尬,但可行。
  • 自动导出MSVS项目中的宏,可能使用this answer中提到的Microsoft.Build.Tasks.Csc.LangVersion听起来很强大但设置起来很棘手,没有进一步调查。
  • 将我们的测试服务器更新为MSVS 2013. 如果可以接受可能是明智的 - 但不回答这个问题!
  • 不,我想:
    • 2010年的子类class SuppressMSVS2010MessageAttribute : SuppressMessageAttribute,2013年是假人。 [SuppressMessage]sealed
    • 使用条件属性(语言规范3.0§17.4.2.2)条件是属性类的属性,而不是属性实例的属性!我没有注意到这一点,因为我觉得它没有帮助。

1 个答案:

答案 0 :(得分:4)

  

C#代码可以以编译器(或语言)版本为条件吗?

不确定。如果您根据您正在使用的编译器的版本手动定义符号。否则,没有。

From the documentation

  

C#编译器本身没有定义您可以在源代码中使用的符号或宏;所有符号定义必须是用户定义的。

即。 &#34;没有符号&#34;包括没有预定义的符号,可以让你确定编译器版本,从而有条件地控制编译。


注意:自然地,&#34;手动定义&#34;并不排除创作自己的构建过程,其中包含一个构建步骤,用于检查csc.exe程序以确定其版本,然后定义一些用于控制编译的符号。这仍然是&#34;手册&#34;就编译器本身而言,你可以自己自动完成它。