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>,这是无效的.