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

C#程序如何检测它是在C#版本下编译的,该版本不包含对该程序中使用的语言function的支持?

当遇到它不支持的语言的function时,C#编译器将拒绝该程序并产生一些错误消息。 这并没有解决这个问题,即说明程序是用旧版本的C#编译器编译的,或者是不支持所需版本的C#的C#编译器。

理想情况下,它会如此简单

#if CS_VERSION < 3 #error CSharp 3 or later is required #end 

我不相信你可以用C#文件做到这一点,但是如果你使用的是MSBuild,那么项目/解决方案工具版本号可以阻止它使用旧版本的MSBuild构建。

你能给出确切的背景吗? 一个“人”解决方案而不是技术方案可能是尝试用所有“旧”版本编译代码,并创建一个文档:“如果你得到这样的错误, 可能意味着你使用的是错误的版本。 ..”

您可能需要考虑的另一个选项是使单个“必需的function”文件更简单。 这可能会被您的主应用程序使用,但要求用户先编译。 如果它工作,你的构建的其余部分应该工作。 如果没有,那是因为使用了错误的版本。 这可能会从不同版本产生较小范围的错误(特别是它没有编译器可以按随机顺序列出来自不同文件的错误的问题)。

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

这没有预定义的符号; 您可以创建自己的符号并在构建脚本中定义它们。 请注意,您可以在项目级别修复语言版本:

项目属性 – >构建 – >高级 – >语言版本:

  • ISO-1是C#1.2
  • ISO-2是C#2.0

(映射到csc /langversion参数)

但请注意,这并不涵盖所有内容 – 这将有一些事情可以通过 – 特别是在generics类型推断方面。 如果您需要支持旧的编译器,这只是一个问题; 在这种情况下…用旧编译器测试

例如:

 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)中不起作用。

简单:如果编译器无法编译代码,编译器将失败并给出错误。

也许您可以阅读supportedRuntime元素:

然后,您可以使用CSharpProjectConfigurationProperties3.DefineConstants基于supportedRuntime定义所需的指令。

您可以在VS中创建一个宏来使用它。