2011-12-31 52 views
7

考慮下面的代碼:如何約束泛型爲枚舉類型?

class Base<T> 
{ 
//Base members 
} 

我想通用噸至是一個枚舉(如果可能的話使用約束)。我怎樣才能在C#中做到這一點?

編輯:
通過阿卡什Kava- -introduced使用代碼合同也似乎是一個很好的方式。我設法讓它產生一個無用的運行時錯誤。 Here是我試過的代碼。應該可以生成編譯時警告,但我無法使其工作。

+1

這是重複的,對嗎? – BoltClock 2011-12-31 16:42:09

+3

鏈接重複請? – atoMerz 2011-12-31 17:00:52

+0

很多人,但規範子裏的一個我能找到的是http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum,這雖然是關於一個通用的方法,不是泛型類,類型約束的工作方式完全一樣。 – BoltClock 2011-12-31 17:08:57

回答

12

這是在IL級支持,但不是在C#。你可以看看Jon Skeet寫的unconstrained melody,它可以讓你實現這個目標。這裏是他詳細解釋的相應blog post

+1

在C#中沒有辦法感到驚訝。 :( – atoMerz 2011-12-31 16:58:44

+0

出於好奇,IL是否允許枚舉約束的泛型做任何不受約束的泛型除了調用慢的'Enum.HasFlag'之外還可以做其他事情?我猜測C#團隊會判斷IL支持的級別對於人們想要用枚舉約束的泛型做什麼是沒有效率的,並且認爲(錯誤地指望恕我直言),禁止它們會比允許它們更好,但不能讓它們做得更多。 – supercat 2013-01-12 17:53:32

+0

有[ExtraConstraints.Fody] (https://github.com/Fody/ExtraConstraints),以實現一個非常簡單的方式,所有的IL-織。只需安裝的NuGet包'Fody'和'ExtraConstraints.Fody'並添加約束的代碼上所示回購。也許你想添加這個答案? – BatteryBackupUnit 2017-07-24 06:52:25