我正在深度阅读C#并遇到了我能理解的内容:
当它被约束为参考类型时,执行的比较类型 取决于类型参数的确切约束条件。
但是无法理解这一点:
如果进一步限制从派生==和!=运算符的特定类型派生,则使用这些重载。
如果有人通过示例解释这个问题,我将非常感激...... Plzz
答案 0 :(得分:3)
==
和!=
是相等和不相等的运算符。
这些可以被不同类型覆盖 - 在覆盖它们的类型中,如果用作泛型类型约束,则此实现将用于使用这些运算符进行比较。
在您的示例中,该行不适用,因为您对覆盖==
的类型没有其他约束:
static bool AreReferencesEqual<T> (T first, T second) where T : class
{
return first==second;
}
如果您有这样的类型(也可以继承),那么:
如果约束T
的类型不会重载==
,则将执行简单的引用相等性测试(默认的Object
实现)。
但是,如果类型确实超载==
(比如一个业务实体,如果两个实例具有相同的id
,则认为它们相同),将使用该实现,无论您是否传入类型或继承类型。
考虑覆盖Person
的{{1}}类。以及将类型参数约束为==
的方法。如果您的Person
源自Employee
并且还会覆盖Person
,则在通用方法中使用==
时,==
将使用==
1}}一个。
答案 1 :(得分:1)
当它被约束到没有operator==
和operator!=
(第一个引用)的引用类型时,编译器知道它不知道除了使用Object.Equals
之外的类型的相等性 - - 它只是参考比较。
如果约束是 具有operator==
和operator!=
的类型,编译器就知道其他Object.Equals
可以使用operator==
用于相等,因此使用类型的{{1}}来测试相等性(通常不是参考比较)。