Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将泛型函数限制为仅对枚举有效_C# - Fatal编程技术网

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