C# 枚举和泛型

12
为什么编译器会抛出以下错误,不允许使用此代码?(我正在使用启用了 C# 7.3 的 VS 2017。)
CS0019 运算符“==”不能应用于类型为 'T' 和 'T' 的操作数。
public class GenericTest<T> where T : Enum
{
    public bool Compare(T a, T b)
    {
        return a == b;
    }
}

没有泛型的版本当然是完全有效的。

public enum A { ONE, TWO, THREE };

public class Test
{
    public bool Compare(A a, A b)
    {
        return a == b;
    }
}

6
返回 a.Equals(b)。 - Dmitry Bychenko
5
可能重复 https://dev59.com/yXRC5IYBdhLWcg3wKtv2(说明:这是一条关于在C#中不能将运算符应用于泛型类型的问题的链接) - Anu Viswan
1
有趣的是,classMyClassdelegateType没有这个限制,而structenumunmanagedIMyInterface有。换句话说,只有编译器能确定它是引用类型时才允许这样做。 - Sinatr
@DmitryBychenko:这个可以运行,但我不明白为什么。 - Frank Puffer
1
@AnuViswan:区别在于,在我的例子中,编译器应该知道它是一个枚举类型,因此应该是可比较的。 - Frank Puffer
1个回答

10
编译器无法保证每个提供给 T 的类型都实现了运算符 ==。你可以添加一个约束来限制 Tclass,但这不允许你将其用于枚举,因为枚举不是引用类型。添加 struct 作为约束也不能让你使用运算符,因为结构体并不总是有 == 运算符的实现,但在这种情况下,你可以使用 a.Equals(b) 来代替。

1
不仅如此。operator ==必须是静态的,因此它甚至不是T的方法集合中可以在通用实现中使用的一部分。 - Matthew Watson
@MatthewWatson - 是的,这个问题在这里有更详细的讨论。然而,答案是正确的 - 在这种情况下使用Equals。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接