2011-01-14 68 views
3

相同在「CLR via C#」一書中提到動態關鍵字對應的FCL類型是System.Object。請澄清這一點。動態與對象

回答

5

從的C#的角度來看,在所有的同樣的事情......但在編譯的代碼,一個變量聲明爲類型dynamic通常(可能總是)與CLR領域或類型的局部變量對應object

C#編譯器負責確保使用該值的任何源代碼都具有對其應用的動態行爲。 object只是表示用於存儲的編譯器。它也適用於[Dynamic]屬性,以便其他代碼知道它將被動態處理。

例如,考慮一下:

public class Foo 
{ 
    public dynamic someField; 
} 

我相信一定會被編譯成IL相當於:

public class Foo 
{ 
    [Dynamic] 
    public object someField; 
} 
現在

,如果你寫:

Foo foo = new Foo(); 
foo.someField = "hello"; 
Console.WriteLine(foo.someField.Length); 

編譯器使用屬性要知道foo.someField是動態的,所以Length本身ty應該是動態綁定的。

2

MSDN來自:

的類型是一個靜態類型,但類型的動態的一個目的繞過靜態類型檢查。在大多數情況下,它具有類型對象的功能。

And

類型的動態行爲就像在大多數情況下類型的對象。但是,包含動態類型表達式的操作不會被編譯器解析或類型檢查。編譯器將有關該操作的信息打包在一起,並且該信息稍後用於在運行時評估操作。作爲該過程的一部分,動態類型的變量被編譯爲對象類型變量。因此,動態類型僅在編譯時存在,而不是在運行時存在。

(重點煤礦)

由於dynamic參考需要能夠採取任何類型,它在類型object的效應(或至少到所有出現,並使用),但編譯器不會對其執行某些類型的檢查。