我想知道是否可以根据编译器版本对任意的C#代码进行条件控制。特别地,我想在MSVS 2010 C#编译器中禁止已知不会由2013编译器产生的Code Analysis警告; 我希望这样做是逐个案例进行的,因此可能是在源代码中实现。
相关问题
- 方法名称的预定义宏
- 关于不同目的的预定义宏
- 如何使C#代码编译需要特定的语言或编译器版本?
- 关于使编译失败在错误版本上的问题;答案不适用
一个示例问题
虽然我对这个问题很感兴趣,但我真正想要的是一个通用的答案。
MSVS 2010会在字符串文字中给出CA2204(“更正拼写…”)警告,而2013则让我通过Custom Dictionary中的<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项目中自动派生宏,可能使用this answer中提到的
Microsoft.Build.Tasks.Csc.LangVersion
。 听起来很强大,但设置起来很棘手,我还没有进一步调查。 - 将我们的测试服务器升级到MSVS 2013。 如果可以接受,可能是明智的选择-但不能回答这个问题!
- 我认为不行:
- 在2010年中创建一个子类
class SuppressMSVS2010MessageAttribute : SuppressMessageAttribute
,在2013年中是虚拟的。[SuppressMessage]
是sealed
! - 使用条件属性(语言规范3.0 §17.4.2.2) 条件性是属性类的属性,而不是属性实例的属性!我没有继续跟进,因为我认为这没有帮助。
- 在2010年中创建一个子类