2017-08-30 65 views
4

我有一个简单的代码,我尝试编译对飞:如何即时编译C#7代码?

namespace A 
{ 
    class Test 
    { 
     public static void Test() 
     {     
      int.TryParse("12", out int result); 
     } 
    } 
} 

通常我使用CSharpCodeProviderCodeDomProvider。不幸的是,过渡到C#6/C#7,我得到以下错误:

error CS1644: Feature `declaration expression' cannot be used because it is not part of the C# 6.0 language specification

整个球场的代码确实包含C#7特点和他们编得很好,使用的MSBuild/xbuild。

我明白这个错误,但我不知道是否有其他方法来编译这段代码?

重要声明 - 我在Mono上运行它,但是我现在没有选择尝试.Net。这可能是单声道问题,但似乎是通用的。

+2

https://www.nuget.org/packages/Microsoft.CSharp/ –

+0

@HansPassant该软件包如何相关? “CSharpCodeProvider”位于“Microsoft.CSharp”*命名空间*中,与“Microsoft.CSharp”*包无关。 – svick

+0

你正在使用System.CodeDom,它没有办法指定一个更新的C#或CLR版本,它停留在版本4上.Roslyn取而代之。 –

回答

4

错误消息似乎表明您正在使用的编译器的版本理解声明表达式,但已被设置为不允许它们。

这是包含在Ubuntu 16.04(Mono 4.2.1)中包含的最新版Mono中的CodeDOM版本的情况。在该版本中,您可以通过设置/langversion:experimental来允许声明表达式。

在CodeDOM的,你这样做,通过设置CompilerParameters.CompilerOptions,例如:

compiler.CompileAssemblyFromSource(
    new CompilerParameters { CompilerOptions = "/langversion:experimental" }, code); 

有了这个代码,您的源代码编译为我在Mono 4.2.1。但是由于这是该版本编译器的一个实验性功能,因此它可能无法完美工作。

有可能升级您的Mono版本可能有所帮助。

我相信/langversion:experimental是特定于单声道,所以这个代码可能不会在其他实现.Net。

+0

这太棒了!我将在.NET上验证这个'langversion'(或者我会#if它),因为这将比完全转换到Roslyn容易得多。它也适用于Mono 5. *(这也意味着“只是”将Mono更新为5. *并不会帮助)。我确信这是Mono中的一种错误。什么样的错误?要么没有这个选项就不能工作,要么它可以工作。也许不是一个错误,但至少与.NET不一致。 –