协变(Covariance)与逆变(Contravariance)是C#泛型中处理类型转换的两个重要概念,它们允许在保持类型安全的前提下,实现泛型类型之间的灵活转换。具体来说:
out
关键字在泛型接口或委托的类型参数上指定。IEnumerable<T>
,其中T
使用out
关键字,表示T
只能作为返回值。public interface ICovariant<out T> {
T Get();
}
public class Base { }
public class Derived : Base { }
public class BaseProvider : ICovariant<Base> {
public Base Get() => new Base();
}
ICovariant<Base> baseProvider = new BaseProvider(); // 正常赋值
ICovariant<Derived> derivedProvider = baseProvider; // 这是允许的,因为BaseProvider实现了ICovariant<Base>
in
关键字在泛型接口或委托的类型参数上指定。Action<T>
,其中T
使用in
关键字,表示T
只能作为参数。public interface IContravariant<in T> {
void Set(T value);
}
public class Base { }
public class Derived : Base { }
public class BaseConsumer : IContravariant<Base> {
public void Set(Base value) { /* ... */ }
}
IContravariant<Base> baseConsumer = new BaseConsumer(); // 正常赋值
IContravariant<Derived> derivedConsumer = baseConsumer; // 这是允许的,因为BaseConsumer的Set方法接受Base类型,而Derived是Base的子类
通过上述解释和示例代码,我们可以看到协变与逆变在C#中的实际应用,它们不仅增加了代码的灵活性,还确保了类型安全。
领取专属 10元无门槛券
手把手带您无忧上云