【发布时间】:2015-11-19 17:35:29
【问题描述】:
我想知道是否可以使任意 C# 代码以编译器版本为条件。特别是,我想抑制 MSVS 2010 C# 编译器中的代码分析警告,我知道 2013 编译器没有给出这些警告;我想逐个进行,因此大概在源代码中。
相关问题
-
Predefined macros for method names
- 关于用于不同目的的预定义宏
-
How can compilation of C# code be made to require a given language or compiler version?
- 关于在错误的版本中编译失败;答案不适用
一个示例问题
虽然对这个问题很感兴趣,但我真的想要一个一般性的答案
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) 条件是属性类的属性,而不是属性实例的属性!我没有跟进这个,因为我认为它没有帮助。
- 2010 年的子类
【问题讨论】:
-
很难理解为什么 [CodeAnalysis.SuppressMessage] 属性需要是有条件的。
-
@HansPassant:我并没有说它需要是有条件的,它只是听起来可能给了一个人所需的灵活性。 头脑风暴
-
当你有一个真实的例子回来,SO的门总是敞开的。
-
@HansPassant:我认为我找不到具有条件属性的相关示例,因为我认为它们不是解决方案;我只是想提一下供人们评论的解决方案的想法;毕竟,解释为什么某些方法不起作用会很有帮助。我想这就是我所说的头脑风暴的意思。
-
@HansPassant:实际上 SuppressMessage is 是有条件的,但仅在
CODE_ANALYSIS上,该类的文档说:“ConditionalAttribute 应用于此类,指定预处理符号“CODE_ANALYSIS”作为确定是否包含或省略属性调用的条件符号。如果定义了符号,则包含属性调用;否则,调用将被省略。”……当然,这无济于事。
标签: c# visual-studio-2010 visual-studio-2013 code-analysis