前情提要
在 C# 4.0,有一個新的 Type 叫做 Dynamic Type。
Dynamic Type 不會在 compile time 做 checking,而是在 runtime 的時候編譯器才會知道該變數的 type ,並在 runtime 做 checking。
須注意事項
- 在大多數的時候,可以把 dynamic type 視為 object。
- 如果想要知道該變數在 runtime 的 type,可以使用
GetType()
。
|
|
結果:
Get the actual type of value1: System.String
Get the actual type of value2: System.Int32
- 當 assign 一個 class object 的 type 使用 dynamic 的時候,compiler 並不會偵測這一個 dynamic object 有沒有正確的使用 method 或是 property。
|
|
Run-time exception (line 10): No overload for method 'DisplayStudentInfo' takes '0' arguments
Stack Trace:
[Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: No overload for method 'DisplayStudentInfo' takes '0' arguments]
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at Program.Main() :line 10
- 可以將 dynamic object 當成參數傳入 method。
|
|
- 如果 method 或是 property 不相容,compiler 會在 runtime 有錯誤訊息。
- 在 Visual Studio 中不支持 Intellisense。
- 如果沒有額外做 dynamic type 的 checking,compiler 就不會丟錯誤。
|
|
但在執行的時候會有錯誤。
Run-time exception (line 14): Operator '+' cannot be applied to operands of type 'bool' and 'bool'
Stack Trace:
[Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Operator '+' cannot be applied to operands of type 'bool' and 'bool']
at CallSite.Target(Closure , CallSite , Object , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
at Program.addstr(Object s1, Object s2) :line 14
at Program.Main() :line 8