4

我有以下代码:

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

当我尝试编译时,它给了我以下错误:

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

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

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

4

2 回答 2

3

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

struct A { }

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

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

==on的实现与您的解决方法很好的实现enum非常接近。Equals

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

于 2010-03-04T10:36:08.690 回答
1

看看Jon Skeet 和 Marc Gravell 的这篇文章。它描述了使用 Linq 表达式的“通用运算符”的实现。MiscUtil 库中提供了实际实现

于 2010-03-04T10:44:26.173 回答