C#4.0(.NET 4.5)引入了一個(gè)名為 dynamic 的新類型,它避免了編譯時(shí)類型檢查。dynamic 類型在編譯時(shí)跳過(guò)類型檢查;相反,它在運(yùn)行時(shí)解析類型。
動(dòng)態(tài)類型變量是使用關(guān)鍵字 dynamic 定義的。
dynamic MyDynamicVar = 1;
在大多數(shù)情況下,編譯器會(huì)將動(dòng)態(tài)類型編譯為對(duì)象類型。但是,動(dòng)態(tài)類型變量的實(shí)際類型將在運(yùn)行時(shí)解析。
dynamic MyDynamicVar = 1; Console.WriteLine(MyDynamicVar.GetType());
System.Int32
dynamic 類型會(huì)在運(yùn)行時(shí)根據(jù)分配的值更改類型。以下示例顯示了動(dòng)態(tài)變量如何根據(jù)分配的值更改類型。
static void Main(string[] args) { dynamic MyDynamicVar = 100; Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType()); MyDynamicVar = "Hello World!!"; Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType()); MyDynamicVar = true; Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType()); MyDynamicVar = DateTime.Now; Console.WriteLine("Value: {0}, Type: {1}", MyDynamicVar, MyDynamicVar.GetType()); }
值:100,類型:System.Int32 值:Hello World !!,類型:System.String 值:True,類型:System.Boolean 值:01-01-2014,類型:System.DateTime
動(dòng)態(tài)類型變量將隱式轉(zhuǎn)換為其他類型。
dynamic d1 = 100; int i = d1; d1 = "Hello"; string greet = d1; d1 = DateTime.Now; DateTime dt = d1;
如果將類對(duì)象分配給動(dòng)態(tài)類型,則編譯器將不會(huì)檢查保存自定義類對(duì)象的動(dòng)態(tài)類型的正確方法和屬性名稱??聪旅娴膶?shí)例。
class Program { static void Main(string[] args) { dynamic stud = new Student(); stud.DisplayStudentInfo(1, "Bill");// 運(yùn)行時(shí)錯(cuò)誤,沒(méi)有編譯時(shí)錯(cuò)誤 stud.DisplayStudentInfo("1");// 運(yùn)行時(shí)錯(cuò)誤,沒(méi)有編譯時(shí)錯(cuò)誤 stud.FakeMethod();// 運(yùn)行時(shí)錯(cuò)誤,沒(méi)有編譯時(shí)錯(cuò)誤 } } public class Student { public void DisplayStudentInfo(int id) { } }
在上面的示例中,C#編譯器不檢查參數(shù),參數(shù)類型 或 根本不存在。它在運(yùn)行時(shí)驗(yàn)證這些內(nèi)容,如果無(wú)效,則拋出運(yùn)行時(shí)異常。請(qǐng)注意,動(dòng)態(tài)類型不支持Visual Studio IntelliSense。請(qǐng)注意,動(dòng)態(tài)類型不支持Visual Studio IntelliSense。
動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)(DLR)API提供了支持C#中動(dòng)態(tài)類型的基礎(chǔ)結(jié)構(gòu)。