2009-06-05 21 views
5

C#程序如何檢測到它正在C#版本下編譯,該版本不包含對該程序中使用的語言功能的支持?如何編譯C#代碼來需要給定的語言或編譯器版本?

C#編譯器將在遇到不支持的語言功能時拒絕該程序併產生一些錯誤消息。這並沒有解決這個問題,即聲明該程序正在編譯的C#編譯器版本太舊,或者C#編譯器不支持所需版本的C#

理想情況下,它會是簡單

#if CS_VERSION < 3 
#error CSharp 3 or later is required 
#end 

回答

4

我不相信你可以做到這一點與一個C#文件,但如果你使用的MSBuild那麼該項目/解決方案的工具,版本號可以被使用舊版本的MSBuild內置停止。

你能給出這個的確切上下文嗎?一個「人」的解決方案,而不是技術的解決方案可能是嘗試編譯所有「舊」版本的代碼,並創建一個文檔:「如果你得到這樣的錯誤這個這可能意味着你使用錯誤版本...「

另一個可能需要考慮的選項是使一個」必需特性「文件更簡單。這將不會被你的主應用程序使用,但要求用戶先編譯。如果它有效,其餘的構建應該可以工作。如果沒有,那是因爲使用了錯誤的版本。這可能會產生來自不同版本的更小範圍的錯誤(特別是它不存在編譯器可以按隨機順序列出來自不同文件的錯誤的問題)。

+0

這個上下文是機器生成的C#代碼的編譯,通過命令行編譯器,打破了各種各樣的錯誤,因爲舊版C#編譯器(.NET 2005)在當前版本(.NET 2008 ),並且它並不是很明顯,該錯誤不在C#代碼的生成器中。 – grrussel 2009-06-05 12:54:49

+0

好的 - 這些編譯器是以某種腳本運行的嗎?如果是這樣,那麼RequiredFeatures.cs文件就是有用的。 – 2009-06-05 12:58:57

3

根據預處理指令的this list,似乎不可能。我們通常可以通過使用泛型(檢測2.0),使用自動屬性(3.0)或動態(4.0)來知道

2

沒有預定義的符號;您可以創建自己的符號並在構建腳本中定義它們。請注意,您可以在項目層面解決語言版本:

項目屬性 - >建設 - >高級 - >語言版本:

  • ISO-1是C#1.2
  • ISO-2是C# 2.0

(映射到csc /langversion參數)

但是請注意,這並不能掩蓋一切 - 有幾件事情,這會讓通過 - PA特別是在泛型類推斷領域。如果您需要支持舊的編譯器,這只是一個問題;在這種情況下... 用舊編譯器測試

例如:

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)。

1

簡單:如果編譯器無法編譯代碼,編譯器將會失敗,並給你一個錯誤。