如何即时编译 C#7 代码?

How can I compile C#7 code on the fly?

我有一个简单的代码,我尝试即时编译:

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 的选项。这可能是一个 Mono 问题,但它似乎是通用的。

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

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 特定于 Mono,因此此代码可能不适用于 .Net 的其他实现。