公司的程序一般使用會使用.Net 2.0,在使用VS2010編寫程序后,發(fā)現(xiàn)使用了一些C#3.0,C#4.0特性后,程序居然也可以正常運(yùn)行,對此一直有點迷惑,最近花了點時間仔細(xì)研究了一下。 在討論為什么VS2010會出現(xiàn)這種情況之前,先引入幾個概念,我們重新認(rèn)識一下。 C#版本與C#編譯器C#源代碼要編譯成IL中間語言,需要調(diào)用C#編譯器。C#編譯器其實是一個名為csc.exe的可執(zhí)行文件,通常位于系統(tǒng)目錄下的 Microsoft.NET\Framework\<version> 文件夾中,version指的是.Net的版本,我的電腦中裝有VS2005 VS2008 VS2010時,里面有v1.0 、v1.1 、v2.0、 v3.0、 v3.5、 v4.0幾個版本。經(jīng)過查看,我發(fā)現(xiàn)v2.0 、v3.5、 v4.0里面含有csc.exe文件,而這正好和C#的版本是對應(yīng)的。不難想到,不同版本C#編譯器代表編譯過程中遵循不同C#版本的語法。 現(xiàn)在回到我們的問題:VS2010中.Net2.0工程可以使用C#2.0版本以上的特性。初步可以懷疑VS2010編譯時調(diào)用的是4.0版本的C#編譯器,而不是2.0版本的C#編譯器。 下面實際編譯一段代碼來試驗一下。這段代碼在VS2010生成是可以通過的。 class Program
{
static void Main(string[] args)
{
///隱式類型變量 (C#3.0特性)
var i = 0;
Console.WriteLine(i.ToString());
Console.ReadKey();
}
}
使用2.0的C#編譯器,編譯失敗 使用4.0的C#編譯器,編譯成功 VS2010直接生成得到的ConsoleApplication2.exe,我使用C#編譯器自己生成的是Test.exe文件。現(xiàn)在,我發(fā)現(xiàn)兩個文件有一點不相同。他們引用的mscorlib.dll版本不同。 其實,在設(shè)置項目工程的.Net Framework版本時,就是設(shè)置C#編譯器編譯時調(diào)用對應(yīng)版本的mscorlib.dll文件。(mscorlib.dll到底代表什么,可以查閱CTS BFL等概念) 雖然現(xiàn)在兩個exe文件中的引用不同,但是我們可以手工調(diào)用對應(yīng)版本的mscorlib.dll文件,重新生成一個exe文件。(/nostdlib 禁止導(dǎo)入定義整個 System 命名空間的 mscorlib.dll,也就是4.0的mscorlib.dll) 通過以上實驗,可以說明VS2010調(diào)用了4.0版本的C#編譯器。 C#特性的實現(xiàn)VS2010調(diào)用了4.0版本的C#編譯器成功編譯了.Net 2.0工程的源代碼,說明C#源代碼成功編譯成IL中間語言代碼。但是C#2.0版本以上的特征為什么可以成功編譯,還沒有明白。 C#是高級語言,IL是相對C#低級一些。C#特性在實現(xiàn)上要依賴IL特性。在此我能想到的C#特性的實現(xiàn)有兩種(關(guān)于什么才能稱為特性,我暫且認(rèn)為這個版本新增的就為這個版本的特性):
那么由此C#2.0以上版本的特性,如果屬于第一種情況,那么Net2.0工程中使用是沒有問題的。如果屬于第二種情況,那么需要mscorlib.dll為2.0版本,.Net2.0工程才可以能使用。 經(jīng)過實驗總結(jié):以下特性是可以使用的
總結(jié)有高版本的C#編譯器,就可以使用C#高版本的特性。能用的特性盡情的用,不能用的特性會報錯誤,自然也就無法用了。 為什么在VS2010中編寫.net 2.0程序可以調(diào)用C#2.0以上版本特性?其實從這個問題中,便可以發(fā)現(xiàn)我將.Net版本與C#版本的概念混淆了。這句話應(yīng)該這樣,在VS2010開發(fā)環(huán)境下,使用的是4.0版本的C#編譯器,如果創(chuàng)建.Net 2.0項目,可以使用C#4.0中任何不依賴.Net和僅依賴于.Net 2.0的C#特性。
本文寫的十分淺薄,請結(jié)合一下兩篇文章閱讀,會更清楚一些。 http://www.cnblogs.com/JimmyZhang/archive/2012/11/27/2790759.html http://www.cnblogs.com/PurpleCow/archive/2012/06/17/2552780.html |
|
來自: 昵稱10504424 > 《工作》