请解释 C# 中委托的协变与逆变的概念,并说明它们在实际编程中的应用场景。
考察说明
考查对 C# 委托中协变与逆变概念的理解及其实际应用。
回答思路
- 【回答框架 1】协变允许将返回值类型为派生类型的委托赋值给返回基类型的委托,例如 Func<Derived> 可赋给 Func<Base>。逆变则允许参数类型为基类型的委托赋给参数为派生类型的委托,如 Action<Base> 可赋给 Action<Derived>。
- 【回答框架 2】在 C# 中,泛型委托和接口通过 out 关键字支持协变,通过 in 关键字支持逆变。如 Func<out TResult> 和 Action<in T> 分别体现了这些特性,使用时需注意类型参数的声明。
- 【回答框架 3】实际应用中,协变常用于返回类型,如事件处理或工厂模式,而逆变常用于参数类型,如比较器或回调方法。这些特性提高了类型灵活性,但要求使用时确保类型安全。
- 【关键点 1】协变:委托返回类型可以是派生类型,使用 out 关键字。
- 【关键点 2】逆变:委托参数类型可以是基类型,使用 in 关键字。
- 【关键点 3】通过委托的协变逆变,可以更好地复用与类型安全地使用委托。
- 【易错点 1】混淆协变与逆变的适用方向,导致编译错误。
- 【易错点 2】在非泛型委托中无法使用协变逆变。
- 【易错点 3】滥用可能导致类型不安全,需要确保类型兼容性。