C#面试题更新 2026-08-05

请解释C#中协变与逆变在委托和泛型接口中的具体实现机制,并说明它们如何影响类型安全的赋值兼容性?

风险判断技术原理C#

考察说明

考查对C#类型系统高级特性协变逆变机制的理解,包括实现原理与安全性影响。

回答思路

  1. 【回答框架 1】协变允许用派生类型替代基类型,逆变则允许用基类型替代派生类型。在C#中,通过在泛型类型参数上使用out关键字实现协变,使用in关键字实现逆变。out表示类型只能作为返回值输出,in表示只能作为输入参数,从而保证类型安全。
  2. 【回答框架 2】在委托中,如Func<T>是协变,Action<T>是逆变。声明委托时,方法的参数和返回类型必须符合逆变协变规则。协变允许将返回派生类型的委托赋值给返回基类型的委托,逆变允许将接受基类型的委托赋值给接受派生类型的委托,这基于类型转换的兼容性。
  3. 【回答框架 3】在泛型接口中,如IEnumerable<T>协变,IComparer<T>逆变。接口的泛型参数用out或in标记,编译器检查使用位置确保安全。协变接口只能把T用于返回值,逆变只能用于参数,否则编译错误。
  4. 【回答框架 4】这些机制由CLR在运行时支持,编译器在编译时进行类型安全性检查,确保赋值兼容性,避免类型转换错误,增强了泛型的灵活性。
  5. 【关键点 1】协变用out标记,只能当返回值;逆变用in标记,只能当参数。
  6. 【关键点 2】委托中Func<T>协变,Action<T>逆变,允许相应方向的赋值。
  7. 【关键点 3】接口中IEnumerable<T>协变,IComparer<T>逆变,需遵循位置的限制。
  8. 【关键点 4】编译器静态检查确保类型安全,防止不安全的赋值。
  9. 【易错点 1】不能对同一泛型参数同时标记in和out。
  10. 【易错点 2】协变逆变仅适用于引用类型,不适用于值类型。
  11. 【易错点 3】滥用可能导致运行时类型转换异常。