您可以为 C# 版本添加预处理器指令吗?

Posted

技术标签:

【中文标题】您可以为 C# 版本添加预处理器指令吗?【英文标题】:Can you add a preprocessor directive for a C# version? 【发布时间】:2021-01-31 07:10:41 【问题描述】:

有没有办法添加一个预处理器指令来比较编译器使用的 C# 版本?

例如:

public T MyMethod<T>()

#if CS_7
    return default; // Feature 'default literal' is not available in C# 7.0. Please use 7.1 or greater.
#else
    return null; // Ignore the fact that this won't work, it isn't the point of the question
#endif

.NET 版本会是这里的出路吗?不会有同一个项目使用的编译器不同的情况吗? (即如果不同的员工使用不同版本的 Visual Studio)

【问题讨论】:

一旦编译完成,C# 版本就无关紧要了。您打算以源代码形式提供此内容吗? 该项目被用作跨多个其他项目的子模块(git),所以我猜答案是肯定的? 是否有理由需要将其编译到每个项目中,而不是在单独的程序集中引用?设置私有 NuGet 服务器(本地或托管)并向其发布包非常容易。 我可以向我的上级提及这个想法,但我无法做出这个决定。 【参考方案1】:

显然你不能,但是使用的 C# 版本取决于项目中使用的框架版本 (list of version per framework),它提供默认的 C# 版本,除非通过类似属性的东西手动配置(请参阅链接文档) .

因此,大多数需要 C# 版本预处理器指令的情况可以通过添加 framework preprocessor directive 或使用项目文件中的属性强制项目本身中的特定 C# 版本来解决。

【讨论】:

以上是关于您可以为 C# 版本添加预处理器指令吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 的 #if 中使用 #define 预处理器指令是不是有效

你可以嵌套 C 预处理器指令吗?

C#如何获取已定义预处理器的列表?

如果指令不存在于 c# 中,我的预处理器指令中的代码是不是包含在编译代码中?

C# 预处理器指令

C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif