tle*_*eef 7 c# ienumerable covariance c#-4.0
由于IEnumerable在C#4.0中有一个协变参数,我很困惑它在以下代码中的行为方式.
public class Test
{
IEnumerable<IFoo> foos;
public void DoTestOne<H>(IEnumerable<H> bars) where H : IFoo
{
foos = bars;
}
public void DoTestTwo(IEnumerable<IBar> bars)
{
foos = bars;
}
}
public interface IFoo
{
}
public interface IBar : IFoo
{
}
Run Code Online (Sandbox Code Playgroud)
所以基本上这个DoTestOne方法不会编译DoTestTwo.除了为什么它不起作用,如果有人知道如何实现DoTestOne(分配IEnumberable<H> where H : IFoo给一个IEnumberable<IFoo>)的效果,我将不胜感激.
如果你知道H将是一个类,这确实有效:
public void DoTestOne<H>(IEnumerable<H> bars) where H : class, IFoo
{
foos = bars;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,如果H是值类型,协方差并不完全符合您的预期,因为IEnumerable<MyStruct>实际返回值类型,而IEnumerable<IFoo>必须返回盒装实例.Cast<IFoo>如有必要,您可以使用显式来解决此问题.
| 归档时间: |
|
| 查看次数: |
1005 次 |
| 最近记录: |