我有一个协变类型参数的接口:
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)
为什么这两个案件不一样?