C 8新提案讓泛型Attribute成為現實

2021-09-17 06:43:33 字數 1432 閱讀 4903

從一開始, attribute就是.net的一部分。因此,它們在引入泛型之前就已經被建立好,這意味著如果要引用屬性中的型別,必須暴露乙個type引數或屬性。例如:

[typeconverter(typeof(x))]
這種模式存在一些限制。在上面的示例中,x必須有乙個無引數的建構函式,並繼承typeconverter。編譯器不會強制這些,所以開發人員只能在執行時發現錯誤。

相反,如果我們使用泛型型別引數,那麼就可以在編譯器強制執行這些規則,而且語法會稍微清晰一些。

[typeconverter\u0026lt;x\u0026gt;]
理論上,「allow generic attributes」提案是乙個非常簡單的變更。clr已經支援這個概念,問題是如何在.net語言中使用它。但有時候理論和現實是兩條平行線,而且即使clr可以支援,並不代表就一定會支援。jan kotas解釋說:

我認為這個問題的本質與區域性引用和return類似。區域性引用和return不受任何api的限制,理論上它們在現有的執行時、工具和庫上都能正常執行。但在實際當中,它們可能不能正常執行,因為它們暴露了預先存在的錯誤和限制,可能是因為它們的處理路徑從未被執行過,或者它們明顯不在預期之內。與引用return相關的錯誤和問題剛剛開始出現,因為人們開始使用這項功能,並發現了一些不奏效的地方。我認為這在預期之內。我們應該承認這些事實,並且不會採取之前我們撤回預設值型別建構函式功能那樣的行動。

這個功能非常類似。ecma並沒有針對禁止使用泛型attribute的內容,在理論上應該可以正常執行,但實際上卻沒有。如果要正常執行,必須更新整個系統中的很多部件:

存在多個執行時(mono、corert、整個框架);

il的一些工具也可能會受到影響(編譯器、基於cecil或基於cci2的工具);

可能需要用於訪問泛型attribute的api(例如,現有的反射api不允許你訪問泛型attribute——你必須進行列舉)。

該提案的乙個限制是在編譯時必須「關閉」attribute功能。下面是提案中提供的乙個啟用泛型attribute的例子。

[someattribute\u0026lt;t\u0026gt;]public void dosomething\u0026lt;t\u0026gt;(t input)
因為t不是在編譯時定義的,因此反射機制就不知道這個表示式會返回什麼。

typeof(genericclass\u0026lt;\u0026gt;).getmethod(\u0026quot;dosomething\u0026quot;).getcustomattributes()
狀態

目前,泛型attribute功能列在c# 8路線圖中,狀態為「進行中」。

檢視英文原文

C 8新提案讓泛型Attribute成為現實

從一開始,attribute就是.net的一部分。因此,它們在引入泛型之前就已經被建立好,這意味著如果要引用屬性中的型別,必須暴露乙個type引數或屬性。例如 typeconverter typeof x 這種模式存在一些限制。在上面的示例中,x必須有乙個無引數的建構函式,並繼承typeconver...

C 8新提案讓泛型Attribute成為現實

從一開始,attribute就是.net的一部分。因此,它們在引入泛型之前就已經被建立好,這意味著如果要引用屬性中的型別,必須暴露乙個type引數或屬性。例如 typeconverter typeof x 這種模式存在一些限制。在上面的示例中,x必須有乙個無引數的建構函式,並繼承typeconver...

C 8新提案讓泛型Attribute成為現實

從一開始,attribute就是.net的一部分。因此,它們在引入泛型之前就已經被建立好,這意味著如果要引用屬性中的型別,必須暴露乙個type引數或屬性。例如 typeconverter typeof x 這種模式存在一些限制。在上面的示例中,x必須有乙個無引數的建構函式,並繼承typeconver...