簡體   English   中英

C#泛型實現

[英]C# generics implementation

我是C#的新手,正試圖在周末編寫SNTP服務器。 在此開發過程中,我最終遇到了與以下問題完全相同的問題: 如何使用泛型將參數傳遞給非泛型方法?

這里重復的問題是:“如何使用泛型將參數傳遞給非泛型方法?” 這個問題的關鍵答案是,所討論的非泛型方法沒有接受對象的重載。

現在,我的問題是一個后續問題:為什么泛型以這種方式實現? 或者換個說法,為什么根本需要約束?

到目前為止,我的理解是泛型有助於保持編譯時類型的安全性,這意味着編譯器知道在編譯時要處理的類型。

為什么沒有實現C#(或者這個問題應該與CLR有關),以使編譯器可以接受這樣的事實,即正在創建一個通用類/方法,在該類/方法中可以提供一個在所有情況下都不可接受的參數。 然后,當調用通用類/方法get時,編譯器可以看到問題並在那時抱怨。

這是技術限制嗎?

似乎很遺憾,無法創建通用方法來包裝具有多個重載的非通用方法。 除非我選擇將類型檢查推遲到運行時才能解決上述問題,否則我將不得不用一組方法包裝此重載方法,每個方法一個簽名,即使其中的代碼看起來相同。 這將是利用通用方法的理想場所。

最能解釋這一點的人是埃里克·利珀特(Eric Lippert),他做到了, 區別什么,第一部分:泛型不是模板

我們只做一次過載解析然后烘烤結果。 當某人(可能在完全不同的程序集中)使用字符串作為方法的類型參數時,我們不會在運行時更改它。 我們為泛型類型生成的IL已經選擇了要調用的方法。 抖動並沒有說“好吧,我碰巧知道,如果我們要求C#編譯器立即使用此附加信息執行,那么它將選擇其他重載。 讓我重寫生成的代碼,以忽略C#編譯器最初生成的代碼……”抖動對C#的規則一無所知。

[...]

現在,如果您確實希望根據參數的運行時類型在運行時重新執行重載解析,則可以為您完成; 這就是C#4.0中新的“動態”功能。 只需將“對象”替換為“動態”,當您進行涉及該對象的調用時,我們將在運行時運行重載解析算法,並動態吐出調用編譯器會選擇的方法的代碼,前提是它知道所有運行時類型在編譯時。

那么為什么不呢:因為運行時不知道如何重新生成所需的代碼。

關於某種設計哲學的觀點是,您的代碼應盡早(最好是在編譯時)失敗,但我現在找不到該報價。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM