我正在深入阅读 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==来测试相等性(这通常不是参考比较)。