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 之间进行比较,它会始终确保正确的行为吗?
这是约束系统的一个不受欢迎的限制。您不能根据值类型的特定操作来约束值类型,除非它们是在接口中定义的。因此,您不能约束运算符定义,因为它们不会在所有值类型上定义,并且struct约束允许传入任何值类型。
struct A { }
Run Code Online (Sandbox Code Playgroud)
这没有==定义,但你的约束表明你很乐意接受它。所以你不能使用==.
引用类型不同的原因是因为总是有一个==可用的定义(身份比较)。
==on的实现enum与您的解决方法的实现足够接近Equals。
>与数字类型的情况进行比较!那里没有这样的解决方法。GreaterThan标准数字与等方法没有接口。