2010-11-19 54 views
4

我有以下通用函数:限制的通用功能,只工作在枚举

public SomeType SomeFunction<T>(T value) 
{ 
} 

我现在想限制这种通用的功能只能Enum工作其实如此我尝试了以下内容:

public SomeType SomeFunction<T>(T value) where T : System.Enum 
{ 
} 

,但是这导致:

错误CS0702:约束不能 小号特殊'系统.Enum'

是否有工作和好奇心没有人知道为什么这种类型的约束是不被允许的原因?

+0

你应该看看接受的答案之前在Ani提到的愚蠢。这是C#语言的限制,而不是CLR(例如,可以限制为F#中的enum)。 Unconstrained Melody库提供了一种解决方法,以允许C#本身的枚举约束:http://code.google.com/p/unconstrained-melody/ – LukeH 2010-11-19 10:47:45

回答

5

你不能。您可以将其限制为值类型,但仅此而已。它限制为枚举只能使用运行时检查来完成:

public SomeType SomeFunction<T>(T value) where T : struct 
{ 
    if (!typeof(T).IsEnum) 
    { 
     throw new NotSupportedException("Only enums are supported."); 
    } 
} 
+1

+1。还值得注意的是System.Enum不是枚举。 – 2010-11-19 10:30:40

+0

问题是我有另一个非泛型的函数,它现在没有被调用,因为所有对'SomeFunction'的调用都被路由到通用版本,gah! – 2010-11-19 10:32:26

+0

你实际上可以使约束更紧一点,而不是真的有帮助:'在哪里T:struct,IComparable,IConvertible,IFormattable' – LukeH 2010-11-19 10:32:31

1

史蒂芬是正确的,但你可以缩小它一点,你就抛出一个异常

public SomeType SomeFunction<T>(T value) where T : struct 
+2

这比史蒂文说的少。 -1 – 2010-11-19 10:32:12

+1

-1是不值得的,因为我编辑了我的答案以后添加'where T:struct'。此编辑可能会跨过这篇文章。 – Steven 2010-11-19 11:47:04

+0

好的,但是(根据SO计时)你在Steven之后5分钟回答。如果你说你的答案在某些时候比Steven有更多的信息,你都必须完成忍者编辑,因为我看不到任何编辑要么回答。对不起,如果是这样的话。 – 2010-11-19 11:54:31