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