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

时间:2009-06-05 12:40:42

标签: c#

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

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

理想情况下,它会像

一样简单
#if CS_VERSION < 3
#error CSharp 3 or later is required
#end

5 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

根据预处理器指令的this list,似乎不可能。我们通常可以使用泛型(检测2.0),使用自动属性(3.0)或动态(4.0)

来判断

答案 2 :(得分:2)

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

项目属性 - &gt;构建 - &gt;高级 - &gt;语言版本:

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

也许您可以阅读supportedRuntime元素:

          

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

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