使用比较运算符,如'!='和'==',将值约束为C#中的泛型

19 浏览
0 Comments

使用比较运算符,如'!='和'==',将值约束为C#中的泛型

这个问题已经有了答案:

在C#中不能将==操作符应用于泛型类型吗?

我有下面的代码:

class Foo where T : struct
{
    private T t;
    [...]
    public bool Equals(T t) { return this.t == t; }
}

当我尝试编译时,它会给我以下错误消息:

\'==\'运算符不能应用于类型为\'T\'和\'T\'的操作数

为什么不能这样做?如果约束是where T : class,那么它就可以工作了。但是我需要它成为值类型,因为在我的实现中,这个泛型将始终是枚举类型。

为了绕过这个问题,我正在使用Object.Equals()方法。它会确保始终正确吗?因为我只是在比较T之间的差异。

admin 更改状态以发布 2023年5月19日
0
0 Comments

看一下Jon Skeet和Marc Gravell的这篇文章。它描述了使用Linq表达式实现“泛型运算符”的方法。该实现可在MiscUtil库中获得。

0
0 Comments

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

struct A { }

它没有定义==,但是您的约束说您愿意接受它。因此,您无法使用==

对于引用类型而言,原因不同,因为它们始终有可用的==定义(标识比较)。

enum==实现非常接近Equals的实现,因此您的解决方法是可以的。

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

0