小编Ale*_*x Q的帖子

一般约束类中的协方差

我有一个协变类型参数的接口:

interface I<out T>
{
    T Value { get; }
}
Run Code Online (Sandbox Code Playgroud)

另外,我有一个非泛型基类,另一个派生自它:

class Base
{
}

class Derived : Base
{
}
Run Code Online (Sandbox Code Playgroud)

协方差说I<Derived>可以分配给一个I<Base>,并且确实I<Base> ib = default(I<Derived>);编译得很好.

但是,这种行为显然会随着继承约束的泛型参数而改变:

class Foo<TDerived, TBase>
    where TDerived : TBase
{
    void Bar()
    {
        I<Base> ib = default(I<Derived>); // Compiles fine
        I<TBase> itb = default(I<TDerived>); // Compiler error: Cannot implicitly convert type 'I<TDerived>' to 'I<TBase>'. An explicit conversion exists (are you missing a cast?)
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这两个案件不一样?

c# generics covariance

4
推荐指数
1
解决办法
205
查看次数

标签 统计

c# ×1

covariance ×1

generics ×1