我想知道是否可以根据编译器版本使任意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
之类的内容中,但似乎没有这样的功能测试可行。
在令人满意的顺序中,我考虑了以下内容,并且有兴趣听听别人认为最有效的内容:
MSVS2013
并按上述方式进行抑制。 有点尴尬,但可行。 Microsoft.Build.Tasks.Csc.LangVersion
。 听起来很强大但设置起来很棘手,没有进一步调查。 class SuppressMSVS2010MessageAttribute : SuppressMessageAttribute
,2013年是假人。 [SuppressMessage]
是sealed
! 答案 0 :(得分:4)
C#代码可以以编译器(或语言)版本为条件吗?
不确定。如果您根据您正在使用的编译器的版本手动定义符号。否则,没有。
C#编译器本身没有定义您可以在源代码中使用的符号或宏;所有符号定义必须是用户定义的。
即。 &#34;没有符号&#34;包括没有预定义的符号,可以让你确定编译器版本,从而有条件地控制编译。
注意:自然地,&#34;手动定义&#34;并不排除您创作自己的构建过程,其中包含一个构建步骤,用于检查csc.exe
程序以确定其版本,然后定义一些用于控制编译的符号。这仍然是&#34;手册&#34;就编译器本身而言,你可以自己自动完成它。