如何使C#代码的编译要求特定的语言或编译器版本?

5

一个C#程序如何检测它是否在不支持该程序使用的语言特性的C#版本下进行编译?

当遇到不支持的语言特性时,C#编译器将拒绝该程序并生成一些错误消息。这并没有解决问题,即该程序是使用过时版本的C#编译器编译的,或者是不支持所需C#版本的编译器。

理想情况下,可以简单地:

#if CS_VERSION < 3
#error CSharp 3 or later is required
#end
5个回答

4
我不相信你可以用C#文件做到这一点,但如果你使用MSBuild,那么项目/解决方案工具版本号可以防止它被旧版本的MSBuild构建。
你能给出确切的上下文吗?一个“人类”的解决方案而不是技术方案可能是尝试使用所有“旧”版本编译代码,并创建一个文档:“如果你得到像这样的错误,那么很可能是你使用了错误的版本......”
另一个选择是考虑使用单个“必需功能”文件,这个文件不会被主应用程序使用,但要求用户首先编译它。如果它工作了,那么你的其余构建应该也能工作。如果不行,那就是由于使用了错误的版本。这可能会产生更少的来自不同版本的错误(特别是它没有编译器可能会以随机顺序列出来自不同文件的错误的问题)。

这个问题的背景是,通过命令行编译器编译机器生成的C#代码时,由于路径上先捕获到旧版C#编译器(.NET 2005),而不是当前版本(.NET 2008),因此出现了各种错误,而且很难立即发现问题并非在C#代码生成器中。 - grrussel
好的 - 这些编译器是在某种脚本中运行吗?如果是这样,那么 RequiredFeatures.cs 文件就会很有用。 - Jon Skeet
你能强调一下你所指的4.0特定功能吗?这与/langVersion有何不同?我很想看看它对我下面给出的示例做了什么... - Marc Gravell
Marc:你说得对,它是langversion,而且已经存在一段时间了。我记得以前遇到过它的问题,就像这里列出的那样:http://msmvps.com/blogs/jon_skeet/archive/2007/11/20/vs2005-and-vs2008-co-existence.aspx 我已经编辑了答案,删除了那部分内容 - 你解释得更好 :) - Jon Skeet

3
根据这个预处理器指令列表,似乎不可能。通常我们可以通过使用泛型(检测2.0),使用自动属性(3.0)或动态类型(4.0)来判断。

2
没有预定义的符号可以使用,您可以创建自己的符号并在构建脚本中定义它们。请注意,您可以在项目级别上固定语言版本:
项目属性->构建->高级->语言版本:
- ISO-1是C# 1.2 - ISO-2是C# 2.0
(映射到csc / langversion参数)
但请注意,这并不能涵盖所有内容 - 在泛型类型推断领域特别是存在一些问题。只有在需要支持旧编译器时才会出现此问题; 如果是这种情况,请使用旧编译器进行测试。
例如:
int[] arr1 = { 1, 2, 3, 4, 5 };
string[] arr2 = Array.ConvertAll(arr1, delegate (int i) {return i.ToString();});

这在.NET 3.5/ISO-2(伪C# 2.0)中可行,但在.NET 2.0(正宗的C# 2.0)中不起作用。

2

简单易懂:如果编译器无法编译代码,它将会失败并显示错误信息。


0

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