【问题标题】:Can C# code be conditional on the compiler (or language) version? [closed]C# 代码能否以编译器(或语言)版本为条件? [关闭]
【发布时间】:2015-11-19 17:35:29
【问题描述】:

我想知道是否可以使任意 C# 代码以编译器版本为条件。特别是,我想抑制 MSVS 2010 C# 编译器中的代码分析警告,我知道 2013 编译器没有给出这些警告;我想逐个进行,因此大概在源代码中。

相关问题

一个示例问题

虽然对这个问题很感兴趣,但我真的想要一个一般性的答案

MSVS 2010 对字符串文字中的类名发出 CA2204(“更正拼写...”)警告,而 2013 让我使用自定义词典中的 <Compound> 元素消除此问题。 2010 年的文档表明它仅支持元素 <Dictionary> — <Words> — <Recognized> — <Word>(但使用包含 <Compound> 的字典似乎没有问题)。

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

因此,我想在 #if !MSVS2013 之类的条件下包含一个 [CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA2204…"…] 属性,但似乎没有这样的功能测试是可行的。

可能的解决方案

按照满意度降序排列,我考虑了以下几点,并有兴趣了解其他人认为最有效的方法:

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

【问题讨论】:

  • 很难理解为什么 [CodeAnalysis.SuppressMessage] 属性需要是有条件的。
  • @HansPassant:我并没有说它需要是有条件的,它只是听起来可能给了一个人所需的灵活性。 头脑风暴
  • 当你有一个真实的例子回来,SO的门总是敞开的。
  • @HansPassant:我认为我找不到具有条件属性的相关示例,因为我认为它们不是解决方案;我只是想提一下供人们评论的解决方案的想法;毕竟,解释为什么某些方法不起作用会很有帮助。我想这就是我所说的头脑风暴的意思。
  • @HansPassant:实际上 SuppressMessage is 是有条件的,但仅在 CODE_ANALYSIS 上,该类的文档说:“ConditionalAttribute 应用于此类,指定预处理符号“CODE_ANALYSIS”作为确定是否包含或省略属性调用的条件符号。如果定义了符号,则包含属性调用;否则,调用将被省略。”……当然,这无济于事。

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


【解决方案1】:

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

当然。如果根据您使用的编译器版本手动定义符号。否则,不行。

From the documentation:

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

即“无符号”包括没有预定义的符号,可以让您确定编译器版本,从而有条件地控制编译。


注意:自然地,“手动定义”并不排除编写自己的构建过程,其中包含一个构建步骤,检查csc.exe 程序以确定其版本,然后定义一些符号用于控制编译。就编译器本身而言,这仍然是“手动”的,但您当然可以自己自动化它。

【讨论】:

  • 感谢您找到该声明。我查看了语言定义,但它当然真的是一个编译器问题——不同的编译器可以很好地定义一些东西。该语言似乎并没有要求编译器不定义任何东西,除非您阅读“.在源文件的词法处理开始时,条件编译符号是未定义的,除非它已由外部机制(例如命令行编译器选项)显式定义。”(第 2.5.1 节)版本 3.0 和 5.1) 那样,我不这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多