dynamic型別允許編寫忽略編譯期間的型別檢查的程式碼。 編譯器假定,給d ynamic型別的物件定義的任操作都是有效的。 如果該操作無效,則在程式碼執行之前不會檢測該錯誤,如下面的範例所示:
這個範例沒有編譯,因為它呼叫了staticPerson.GetFullName方法。因為Person 物件上的方法不接受兩個參數,所以編譯器會提示出錯。如果註釋掉該行程式碼,這個範例就會編譯。如果執行它,就會發生一個執行錯誤。所丟擲的異常是RuntimeBinderException 異常。RuntimeBinder物件會在執行時判斷該呼叫,確定Person類是否支持被呼叫的方法。
與 var 關鍵字不同,定義為dynamic的物件可以在執行期間改變其型別。註意在使用var關鍵字時,物件型別的確定會證遲。型別一旦確定,就不能改變。動態物件的型別可以改變,而且可以改變影次,這不同於把物件的型別事轉換為另一種型別。在強制轉換物件的型別時,是用另一種相容的類聚們建一個新物件。如,不能把int強制轉換為Penon物件。在下面的範例中,如果物件是動態物件,就可以把它從int變成Persor型別:
staticvoidMain(string[] args)
{
//var staticperson = new Person();
//dynamic dynamicPerson = new Person();
//staticperson.GetFullName("John", "Smith");
//dynamicPerson.GetFullName("Jchn", "Smith");
dynamic dyn;
dyn = 100;
Console.WriteLine(dyn.GetType());
Console.WriteLine(dyn);
dyn = "This is a string";
Console.WriteLine(dyn.GetType());
Console.WriteLine(dyn);
dyn = new Person() { FirstName = "Bugs", LastName = "Bunny" };
Console.WriteLine(dyn.GetType());
Console.WriteLine($"{dyn.FirstName}{dyn.LastName}");
Console.ReadKey();
}
執行這段程式碼可以看出,dyn物件的型別實際上從System.Int32變成System.String.再變成Person。如果 dyn聲明為int 或string,這段程式碼就不會編譯。
註意:對於dynamic 型別有兩個限制。動態物件不支持擴充套件方法,匿名函式(lambda運算式)也不能用作動態方法呼叫的參數,因此LINQ不能用於動態物件,大多數LINQ呼叫大都是擴充套件方法,而lambda運算式用作這些擴充套件方法的參數.
技術群: 添加小編微信並備註進群
小編微信:mm1552923
公眾號:dotNet編程大全