首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

打字中协变与逆变位置的区别

协变(Covariance)与逆变(Contravariance)是C#泛型中处理类型转换的两个重要概念,它们允许在保持类型安全的前提下,实现泛型类型之间的灵活转换。具体来说:

协变(Covariance)

  • 基础概念:允许使用比原始指定的派生类型的派生程度更大的类型。
  • 关键字:使用out关键字在泛型接口或委托的类型参数上指定。
  • 应用场景:泛型接口或委托的返回类型,如IEnumerable<T>,其中T使用out关键字,表示T只能作为返回值。
  • 示例代码
代码语言:txt
复制
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>

逆变(Contravariance)

  • 基础概念:允许使用比原始指定的派生类型的派生程度更小的类型。
  • 关键字:使用in关键字在泛型接口或委托的类型参数上指定。
  • 应用场景:泛型接口或委托的参数类型,如Action<T>,其中T使用in关键字,表示T只能作为参数。
  • 示例代码
代码语言:txt
复制
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#中的实际应用,它们不仅增加了代码的灵活性,还确保了类型安全。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券