分配IEnumerable(协方差)

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>)的效果,我将不胜感激.

Dan*_*ant 9

如果你知道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>如有必要,您可以使用显式来解决此问题.