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