【问题标题】:C# Enums and GenericsC# 枚举和泛型
【发布时间】:2019-08-02 07:02:44
【问题描述】:

为什么编译器会拒绝此代码并出现以下错误? (我使用 VS 2017 并启用了 C# 7.3。)

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;
    }
}

【问题讨论】:

  • return a.Equals(b);?
  • 有趣。 classMyClassdelegateType没有这个限制,structenumunmanagedIMyInterface有。换句话说,只有当编译器可以确定它是引用类型时才允许。
  • @DmitryBychenko:这可行,但我不明白为什么。
  • @AnuViswan:不同之处在于,在我的示例中,编译器应该知道它是一个枚举,因此应该具有可比性。

标签: c# generics enums


【解决方案1】:

编译器不能依赖为T 提供的每种类型实现的运算符==。您可以添加一个约束以将T 限制为class,但这将不允许您将它用于您的枚举,因为枚举不是引用类型。添加struct 作为约束也不允许您使用运算符,因为结构并不总是具有== 运算符的实现,但在这种情况下您可以使用a.Equals(b)

【讨论】:

  • 不仅如此。 operator == 必须是静态的,因此它甚至不是 T 的可用于通用实现的方法集的一部分。
  • @MatthewWatson - 是的,并且更详细地讨论了here。但是,答案是正确的 - 在这种情况下使用 Equals。
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多