2

我正在深入阅读 C# 并遇到了这个我可以理解的内容:

当它被限制为引用类型时,执行的比较类型取决于类型参数被限制为什么。

但无法理解这一点:

如果进一步限制从重载 == 和 != 运算符的特定类型派生,则使用这些重载。

如果有人通过示例来解释这一点,我将不胜感激...... Plzz

4

2 回答 2

3

==!=是等式和不等式运算符。

这些可以被不同的类型覆盖 - 在已经覆盖它们的类型中,如果用作泛型类型约束,则此实现将用于使用这些运算符进行比较。

在您的示例中,该行不适用,因为您对覆盖的类型没有额外的约束==

static bool AreReferencesEqual<T> (T first, T second) where T : class
{ 
  return first==second; 
}

如果您有这样的类型(也可以继承),那么:

如果T被约束的类型没有重载==,则会进行简单的引用相等测试(默认Object实现)。

但是,如果该类型确实重载==(例如,一个业务实体,如果两个实例具有相同的实例,则id它们被认为是相同的),无论您传入该类型还是继承类型,都将使用该实现。

考虑一个Person覆盖==. 以及将类型参数约束为Person. 如果您有一个Employee派生自Person并覆盖的====则在泛型方法中使用时,==使用的将是那个Person

于 2013-01-27T18:27:31.800 回答
1

当它被限制为没有operator==and operator!=(第一个引号)的引用类型时,编译器知道它不知道除了 use 之外的类型的相等性——它Object.Equals只是进行引用比较。

如果约束是一个确实operator==and的类型,operator!=编译器就知道有其他东西Object.Equals可以用于相等性,因此使用该类型operator==来测试相等性(这通常不是参考比较)。

于 2013-01-27T18:43:43.710 回答