在Visual C# 2010中引入了一種新的dynamic類型,該類型是一個靜態的(static)類型,但是一個 dynamic類型的對象會繞過靜態類型檢查。在大多數情況下dynamic和object類型有些相似,但是在編譯時 ,dynamic類型被假定為支持任何操作,也就是說dynamic類型的對象可以是一個Office對象,可以是一個 COM對象或者是DOM對象,而如果在運行時發現該對象不是期望的對象則會拋出一個運行時異常。
由於把一個對象定義為dynamic類型,因此在代碼中編寫任意調用在編譯時都是合法的(這一點在聲明 為object類型時不能成立)。例如以下代碼能夠通過編譯:
運行後發現obj並不支持UpdateWordDocument方法,因此會拋出異常:
大多數動態類型操作的結果仍是動態類型,例如編寫如下代碼時智能提示會顯示變量的類型是dynamic :
在包含從dynamic類型到其他類型的轉換,或者將dynamic類型作為構造函數參數的操作結果不會返回 dynamic類型,例如以下代碼:
此時c不是dynamic類型。
開發人員可以輕松的在dynamic和非dynamic類型之間轉換,正是由於dynamic類型在編譯時被視為支持 任何操作,所在只需要保證它們之間的轉換是正確的數據類型轉換,否則運行時會發生錯誤。例如以下代 碼:
使用了通過動態類型參數的方法會在運行時解析而不是在編譯時解析,在.NET Framework 4 Beta1中 引入了新的dynamic language runtime(DLR),它為C#中的dynamic類型提供了支持,而且提供了對諸如 IronPython和IronRuby等動態語言的實現。
Visual C# 2010使用dynamic類型和命名和可選參數為與COM API交互提供了便利。許多COM方法接收各 種類型參數並且通常會返回object類型值,開發人員需要進行類型轉換以進行進一步操作。在.NET Framework 4中,如果使用/link開關編譯程序,dynamic類型允許在COM調用時將object類型作為dynamic 類型對待,這樣可以避免類型轉換。例如以下代碼(此代碼系摘錄,機器原因未經過本人測試)