2017-08-30 89 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不一致。 –