泛型类型的约束不能在IEnumerable中使用?

时间:2015-10-04 18:46:49

标签: c#

可能有一个问题,但我无法提出搜索条件来寻找答案..

我可能在这里遗漏了一些明显的东西,但为什么我不允许这样做,这会产生错误:

  

&#34;参数1:无法从System.Collections.Generic.IEnumerable<TType>转换为System.Collections.Generic.IEnumerable< Test.A>&#34;

同时打电话给DoSomething?

public interface A
{
    void Foo();
}

public class B : A
{
    public void Foo()
    {
    }
}

class Test<TType> where TType : A
{
    public Test(IEnumerable<TType> testTypes)
    {
        DoSomething(testTypes);
    }

    void DoSomething(IEnumerable<A> someAs)
    {
    }
}

虽然当然可以这样做:

class Test
{
    public Test(IEnumerable<B> testTypes)
    {
        DoSomething(testTypes);
    }

    void DoSomething(IEnumerable<A> someAs)
    {
    }
}

1 个答案:

答案 0 :(得分:6)

方差仅适用于参考类型。在您的代码TType中也可以是值类型。如果添加class约束,代码将编译

class Test<TType> where TType : class, A
{
    public Test(IEnumerable<TType> testTypes)
    {
        DoSomething(testTypes);
    }

    void DoSomething(IEnumerable<A> someAs)
    {
    }
}

您可以找到详细解释here