我有一个简单的代码,我尝试动态编译:
namespace A
{
class Test
{
public static void Test()
{
int.TryParse("12", out int result);
}
}
}
通常我使用CSharpCodeProvider
或CodeDomProvider
。不幸的是,转换到C#6 / C#7后,我收到以下错误:
错误CS1644:无法使用功能“声明表达式”,因为它是 不属于C#6.0语言规范
当然整个代码确实包含C#7功能,并且使用msbuild / xbuild编译得很好。
我理解错误,但我不知道是否还有其他方法可以编译此代码?
重要通知 - 我在Mono上运行它,但我现在没有选择尝试.Net的选项。它可能是单声道问题,但它看起来似乎是通用的。
答案 0 :(得分: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
特定于Mono,因此此代码可能不会在.Net的其他实现上工作。