根据编译器版本进行条件编译

10

我正在寻求一种像这样实现的方法:

#if CSHARP_COMPILER_IS_FOR_CSHARP_6_OR_HIGHER
    foo?.Bar();
#else
    if (foo != null)
    {
        foo.Bar();
    }
#endif
当然,我可以自己定义条件编译符号,但这并不合适。
有没有内置的常量?我找到的问题都相当老了。也许现在已经变得更好了吗?

1
不,据我所知,他们没有改变任何东西 :-) 也许你可以在 csproj 中做一些魔法来定义常量... - xanatos
1
你为什么要这样做呢?生成的IL代码将是相同的,而且代码变得(很多)不易读懂了... - jeroenh
@jeroenh:这是一个临时的“补丁”,在转移到VS 2015/C#6时使用。我需要能够使用C#5和C#6编译源代码,使一些API对新版本的代码过时,并稍后删除“旧”代码部分。 - Dennis
看起来为了微小的收益而增加了很多开销。并不是说你的C#5代码在C#6下不能编译了... 对我来说,最轻松的方法似乎是推迟使用C#6的特定功能,直到你完全转换完成... - jeroenh
@jeroenh:如果问题仅限于单个方法和'?. ' 运算符,我会同意你的看法...但这只是一个示例。 - Dennis
1个回答

2
没有,据我所知他们没有改变任何东西 :-)
你可以在csproj中进行一些魔法来定义常量...但这很复杂...
没有直接指定CSC版本的属性...有一个属性($(LangVersion))指定所需的语言标准版本...但通常设置为默认值,即“编译器支持的最大版本”...
或者你可以查看CSC编译器的路径...它存储在CscToolPath中,如果为空,则存储在MsBuildToolsPath中。从那里,也许你可以辨别出CSC的版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接