typeof是運算符,和C一樣。

事實上C++也可以寫sizeof(T)么。。。。。

當然,C#的T不是在編譯時展開的,而是在運行時,JIT編譯之前(對於值類型會展開,引用類型則直接特殊處理共用代碼)。所以這個T有特殊處理,他是一個特殊的類型,所有與類型相關的運算符都做了處理。例如default(T)和T?以及new T()。

當然也不是什麼大不了的處理就是了。
typeof在編譯的IL代碼中是調用的System.Type.GetTypeFromHandle(RuntimeTypeHandle handle)函數來返回相應的Type對象。之所以typeof能判斷int還是string應該是傳入了不同的RuntimeTypeHandle參數值。你可以用ILSpy這個工具載入你的demo看看編譯過後的IL代碼。


不熟悉C#的編譯流程, 但C++中, 模板實參的確定是編譯時的.

你的代碼在C++中會同時生成int版和string版的函數代碼, 待到執行時執行不同的函數.

補充:

C#中的泛型在編譯期編譯為無具體類型但有佔位符的IL代碼, 再在實際運行時從佔位符代碼編譯成具體類型的本地代碼.據我的理解typeof操作符應當是在第二個過程中產生作用的.


運算符 之所以能夠動態推斷類型是因為c#有一個c語言沒有的東西 叫做元數據

有返回值,我個人認為,應該是一個函數,這裡有一套教程,你可以看一下

https://www.xin3721.com/eschool/CSharpxin3721/?

www.xin3721.com


推薦閱讀:
相关文章