C# 将泛型函数限制为仅对枚举有效
我有以下通用功能:C# 将泛型函数限制为仅对枚举有效,c#,C#,我有以下通用功能: public SomeType SomeFunction<T>(T value) { } 但这导致: 错误CS0702:无法删除约束 特殊类“System.Enum” 出于好奇,有人知道为什么不允许这种类型的约束吗?你不能。您可以将其限制为值类型,但仅此而已。只能使用运行时检查将其限制为枚举: public SomeType SomeFunction<T>(T value) where T : struct { if (!typeof(T).
public SomeType SomeFunction<T>(T value)
{
}
但这导致:
错误CS0702:无法删除约束
特殊类“System.Enum”
出于好奇,有人知道为什么不允许这种类型的约束吗?你不能。您可以将其限制为值类型,但仅此而已。只能使用运行时检查将其限制为枚举:
public SomeType SomeFunction<T>(T value) where T : struct
{
if (!typeof(T).IsEnum)
{
throw new NotSupportedException("Only enums are supported.");
}
}
publicsometypesomefunction(T值),其中T:struct
{
if(!typeof(T).IsEnum)
{
抛出新的NotSupportedException(“仅支持枚举”);
}
}
Steven是正确的,但您可以在抛出异常之前缩小范围
public SomeType SomeFunction<T>(T value) where T : struct
publicsometypesomefunction(T值),其中T:struct
+1。还值得注意的是System.Enum不是一个Enum。问题是我有另一个同名的非泛型函数,现在没有调用它,因为对SomeFunction
的所有调用都被路由到泛型版本,呵呵!实际上,您也可以将约束变得更紧一点,这并不是说它真的有多大帮助:其中T:struct、IComparable、IConvertible、IFormattable
@Moo Juice:Is System.Enum不是枚举,同样的道理System.ValueType不是值类型?@Matt correct。System.ValueType只是值类型装箱时的容器,因此作为泛型参数是无用的。而System.Enum就是从中派生出来的:)这比Steven说的要少-1-1是不值得的,因为我编辑了我的答案,以便在后面添加where T:struct
。这篇编辑可能越过了这篇文章。好吧,但是(根据SO计时)你在史蒂文5分钟后回答了。如果你们说你们的答案在某一点上比史蒂文的答案有更多的信息,你们两个一定都做过忍者编辑,因为我看不到任何一个答案的编辑。如果是这样的话,很抱歉。你应该看看Ani提到的dupe中被接受的答案。这是C语言的限制,而不是CLR(例如,可以在F中约束到enum
)。无约束Melody库提供了一种变通方法,允许C#本身中的enum
约束:
public SomeType SomeFunction<T>(T value) where T : struct