更新:以下代码仅在 C#4.0 (Visual Studio 2010) 中有意义
看来我对协变/逆变有一些误解。谁能告诉我为什么以下代码无法编译?
public class TestOne<TBase>
{
public IEnumerable<TBase> Method<TDerived>(IEnumerable<TDerived> values)
where TDerived: TBase
{
return values;
}
}
编译时:(!!!)
public interface IBase
{
}
public interface IDerived: IBase
{
}
public class TestTwo
{
public IEnumerable<IBase> Method(IEnumerable<IDerived> values)
{
return values;
}
}
最佳答案
协变仅适用于引用类型(对于类型参数),因此您必须添加类约束:
public IEnumerable<TBase> Method<TDerived>(IEnumerable<TDerived> values)
where TDerived : class, TBase
{
return values;
}
这将阻止您尝试转换,例如 IEnumerable<int>
进入 IEnumerable<object>
, 这是无效的。
关于c# - 协变/逆变 : how to make the following code compile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9363699/