溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#8泛型Attribute怎么理解

發(fā)布時間:2021-12-03 09:17:02 來源:億速云 閱讀:168 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“C#8泛型Attribute怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“C#8泛型Attribute怎么理解”吧!

從一開始, Attribute 就是.NET 的一部分。因此,它們在引入泛型之前就已經(jīng)被創(chuàng)建好,這意味著如果要引用屬性中的類型,必須暴露一個 Type 參數(shù)或?qū)傩?。例如?/p>

   
   [TypeConverter(typeof(X))]

這種模式存在一些限制。在上面的示例中,X 必須有一個無參數(shù)的構(gòu)造函數(shù),并繼承 TypeConverter。編譯器不會強制這些,所以開發(fā)人員只能在運行時發(fā)現(xiàn)錯誤。

相反,如果我們使用泛型類型參數(shù),那么就可以在編譯器強制執(zhí)行這些規(guī)則,而且語法會稍微清晰一些。

   
   [TypeConverter<X>]

理論上,“Allow Generic Attributes”提案是一個非常簡單的變更。CLR 已經(jīng)支持這個概念,問題是如何在.NET 語言中使用它。但有時候理論和現(xiàn)實是兩條平行線,而且即使 CLR 可以支持,并不代表就一定會支持。Jan Kotas 解釋說:

我認(rèn)為這個問題的本質(zhì)與局部引用和 return 類似。局部引用和 return 不受任何 API 的限制,理論上它們在現(xiàn)有的運行時、工具和庫上都能正常運行。但在實際當(dāng)中,它們可能不能正常運行,因為它們暴露了預(yù)先存在的錯誤和限制,可能是因為它們的處理路徑從未被執(zhí)行過,或者它們明顯不在預(yù)期之內(nèi)。與引用 return 相關(guān)的錯誤和問題剛剛開始出現(xiàn),因為人們開始使用這項功能,并發(fā)現(xiàn)了一些不奏效的地方。我認(rèn)為這在預(yù)期之內(nèi)。我們應(yīng)該承認(rèn)這些事實,并且不會采取之前我們撤回默認(rèn)值類型構(gòu)造函數(shù)功能那樣的行動。

這個功能非常類似。ECMA 并沒有針對禁止使用泛型 Attribute 的內(nèi)容,在理論上應(yīng)該可以正常運行,但實際上卻沒有。如果要正常運行,必須更新整個系統(tǒng)中的很多部件:

  1. 存在多個運行時(Mono、CoreRT、整個框架);

  2. IL 的一些工具也可能會受到影響(編譯器、基于 Cecil 或基于 CCI2 的工具);

  3. 可能需要用于訪問泛型 Attribute 的 API(例如,現(xiàn)有的反射 API 不允許你訪問泛型 Attribute——你必須進(jìn)行枚舉)。

該提案的一個限制是在編譯時必須“關(guān)閉”Attribute 功能。下面是提案中提供的一個啟用泛型 Attribute 的例子。

   
   
   [SomeAttribute<T>]public void DoSomething<T>(T input) { }

因為 T 不是在編譯時定義的,因此反射機制就不知道這個表達(dá)式會返回什么。


   
   
  

typeof(GenericClass<>).GetMethod("DoSomething").GetCustomAttributes()


狀態(tài)

目前,泛型 Attribute 功能列在C# 8 路線圖中,狀態(tài)為“進(jìn)行中”。

到此,相信大家對“C#8泛型Attribute怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI