使用比较运算符,例如“!=”和“==”,并将泛型限制为 C# 中的值

Ric*_*cio 5 c# generics constraints value-type

我有以下代码:

class Foo<T> where T : struct
{
    private T t;
    [...]
    public bool Equals(T t) { return this.t == t; }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,出现以下错误:

运算符“==”不能应用于“T”和“T”类型的操作数

为什么做不到呢?如果有约束的话,where T : class它就会起作用。但我需要它是值类型,因为在我的实现中,这个泛型将始终是一个枚举。

我正在做的就是使用Object.Equals()方法来规避这种情况。因为我只是在 T 之间进行比较,它会始终确保正确的行为吗?

Dan*_*ker 3

这是约束系统的一个不受欢迎的限制。您不能根据值类型的特定操作来约束值类型,除非它们是在接口中定义的。因此,您不能约束运算符定义,因为它们不会在所有值类型上定义,并且struct约束允许传入任何值类型。

struct A { }
Run Code Online (Sandbox Code Playgroud)

这没有==定义,但你的约束表明你很乐意接受它。所以你不能使用==.

引用类型不同的原因是因为总是有一个==可用的定义(身份比较)。

==on的实现enum与您的解决方法的实现足够接近Equals

>与数字类型的情况进行比较!那里没有这样的解决方法。GreaterThan标准数字与等方法没有接口。