协方差/逆变:如何编译以下代码

Tri*_*Gao 13 c# generics covariance c#-4.0

更新:以下代码仅在C#4.0(Visual Studio 2010)中有意义

似乎我对协方差/逆变事物有一些误解.谁能告诉我为什么以下代码无法编译?

public class TestOne<TBase>
{
    public IEnumerable<TBase> Method<TDerived>(IEnumerable<TDerived> values)
        where TDerived: TBase
    {
        return values;
    }
}
Run Code Online (Sandbox Code Playgroud)

而这一个编译:( !!!)

public interface IBase
{
}
public interface IDerived: IBase
{
}
public class TestTwo
{
    public IEnumerable<IBase> Method(IEnumerable<IDerived> values)
    {
        return values;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 13

协方差仅适用于引用类型(对于类型参数),因此您必须添加类约束:

public IEnumerable<TBase> Method<TDerived>(IEnumerable<TDerived> values)
    where TDerived : class, TBase
{
    return values;
}
Run Code Online (Sandbox Code Playgroud)

这会阻止您尝试转换,说,一个IEnumerable<int>IEnumerable<object>,这是无效的.