C#in Depth:键入Constraint

时间:2013-01-27 18:24:50

标签: c#

我正在深度阅读C#并遇到了我能理解的内容:

当它被约束为参考类型时,执行的比较类型 取决于类型参数的确切约束条件。

但是无法理解这一点:

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

如果有人通过示例解释这个问题,我将非常感激...... Plzz

2 个答案:

答案 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}}来测试相等性(通常不是参考比较)。