在C#中理解协变与泛型的协变的问题

我无法理解为什么以下C#代码无法编译。 正如您所看到的,我有一个静态泛型方法Something with IEnumerable <T>参数(并且T被约束为IA接口),并且此参数不能隐式转换为IEnumerable <IA>。 解释是什么? (我不寻找解决方法,只是为了解它为什么不起作用)。

public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }

public static class Test
{
    public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
    {
        var bar = foo.ToList();

        // All those calls are legal
        Something2(new List<IA>());
        Something2(new List<IB>());
        Something2(new List<CIA>());
        Something2(new List<CIAD>());
        Something2(new List<CIB>());
        Something2(new List<CIBD>());
        Something2(bar.Cast<IA>());

        // This call is illegal
        Something2(bar);

        return bar;
    }

    private static void Something2(IEnumerable<IA> foo)
    {
    }
}

我在Something2(bar)行中遇到错误:

Argument 1: cannot convert from 'System.Collections.Generic.List<T>'
 to 'System.Collections.Generic.IEnumerable<ConsoleApp20.Program.IA>'


 
c#
covariance
0s