【问题标题】:How to know the version of the C# using the preprocessor?如何使用预处理器知道 C# 的版本?
【发布时间】:2019-09-26 00:53:48
【问题描述】:

我在调试模式下的项目包含仅支持 C# 7.3 的结构。但在 Release 模式下,项目应基于 C# 7.0 构建,无需特定代码行。

我知道一些标准预处理器符号,例如 NET472NETSTANDARD2_0,但它用于处理不同的标准及其版本。而且对语言版本条件没有用。

public static Expression<TDelegate> CreateExpression<TDelegate>()
    where TDelegate : Delegate // Work in 7.3 and above
{ ... }

我期待一些技巧,比如

#if CSharpVersion >= 7.3
   where TDelegate : Delegate
#endif

现在我使用那个语句:

#if DEBUG
    where TDelegate : Delegate
#endif

但如果我在项目属性中更改语言版本,它将不起作用。

【问题讨论】:

  • 拥有这种不同编译过程的用例是什么?为什么不在 7.3 中编译发行版?
  • 为了回答您的问题,编译器版本没有内置变量。您必须自己管理。
  • C# 没有预处理器,#if 指令被故意削弱以不允许表达式。他们故意不想重现 C 和 C++ 的噩梦。务实的做法是不要更改语言版本。或者在项目属性中定义“CSharpVersion73”,这样您就可以使#if 工作。

标签: c# preprocessor preprocessor-directive c#-7.3 ifdefine


【解决方案1】:

如果您使用 DEBUG 定义来选择语言版本,您可以在 .csproj 文件中进行:

<Project ..>

  <PropertyGroup>
    ...
    <LangVersion>7.0</LangVersion>
    <LangVersion Condition="'$(Configuration)' == 'Debug'">7.3</LangVersion>
    ...
  </PropertyGroup>

  ...

</Project>

请注意,在 UI 中编辑项目设置可能会改变这一点。

【讨论】:

  • 什么意思? VS 已经自动映射了 .csproj 文件中的语言版本和配置。我使用#if DEBUG 删除RELEASE 中的几行代码,因为C#7.3 目前仅用于调试。但是如果我更改配置设置,这个技巧将不起作用。
  • 并且,在调试配置中,语言版本将是 7.3。否则,它将是 7.0。这不是你想要的吗?
  • 谢谢。但我期待一些预处理器技巧,可以让我使用任何语言版本和配置的组合。例如,分别在 6.0(+) 和 5.0(-) 版本中编译时使用 $"x={x}"String.Format("x={0}", x)
  • 每个项目只能使用一个编译器。
  • 我有个建议:为什么不加&lt;DefineConstants Condition="'$(LangVersion)' == '7.3'"&gt;CS_7_3;...&lt;/DefineConstants&gt;呢?这样,当语言版本为给定数字时,您可以在项目中定义常量。不知道这样行不行,我自己没试过,近期可能会试试。
猜你喜欢
  • 2018-04-12
  • 1970-01-01
  • 2015-11-21
  • 2019-01-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多