2013-07-05 46 views
2

我在我的業餘時間一個互動編譯工作兩個名稱相同的領域,我發現我可以使用TypeBuilder定義具有相同名稱的兩個字段定義類型(和類型顯然發射並運行其初始化程序,在這些靜態字段被初始化,就好了)。見我的觀察窗口:TypeBuilder允許定義與

enter image description here

我覺得這很奇怪:可以用同一個名字的兩個字段類型有什麼實際意義?這是每CLR規範真正的「法律」(有興趣的引用),或者是,TypeBuilder或許應該沒有讓這種不確定的或非法的行爲?

+0

的實際理由使用相同的名稱爲兩個不同的領域是代碼混淆。 – rpgmaker

+0

我希望它在類是由元數據系統加載的瞬間拋出。如果沒有,那麼這可能是合法的。無論如何,我會假設CLR使用句柄來標識字段/方法/屬性,而不是名稱。所以,只要生成了一切,並使用句柄或偏移量來糾正成員,它應該是沒問題的。但是,如果某些事情像通過DLR那樣引用它,那麼它可能會拋出AmbiguousMatch。 – quetzalcoatl

+1

我絆倒了[this social.msdn thread](http://social.msdn.microsoft.com/Forums/vstudio/en-US/ed1a92bc-da1e-4a75-a12a-05c6b205ca25/reflection-with-typebuilder-將重複的場-IN-A型),在那裏的說,這是「被設計」 TypeBuilder的和「你要好好照顧它。」 CLR層還沒有提到它是非法的。 – quetzalcoatl

回答

4

這在§I.8.5.2解釋ECMA-335 CLI specification的:

Generally, names are not unique. Names are collected into groupings called scopes. Within a scope, a name can refer to multiple entities as long as they are of different kinds (methods, fields, nested types, properties, and events) or have different signatures.

CLS Rule 5: All names introduced in a CLS-compliant scope shall be distinct independent of kind, except where the names are identical and resolved via overloading. That is, while the CTS allows a single type to use the same name for a method and a field, the CLS does not.

我明白這個問題的方法,這意味着你可以有同類型的兩個同名不同的領域,但他們必須有不同的簽名,即不同的類型。所以,如果你有兩個字段string xint x,即根據CLI規範沒關係。根據公共語言規範(Common Language Specification,CLS),這並不好,但這基本上只是一套使語言互操作性更容易的規則。

在另一方面,與具有相同名稱和類型的兩個字段類型是不合法的,如果你與像他那種類型的組件運行PEVerify,它確實驗證失敗:

[MD]: Error: Field has a duplicate, token=0x04000002. [token:0x04000001]
[MD]: Error: Field has a duplicate, token=0x04000001. [token:0x04000002]

對於某些原因,看起來CLR不做這個檢查,所以它允許這樣的無效類型。 C#編譯器也能夠處理這樣的類型,它似乎選擇了兩個字段中的一個並使用它。