可能有一个问题,但我无法提出搜索条件来寻找答案..
我可能在这里遗漏了一些明显的东西,但为什么我不允许这样做,这会产生错误:
"参数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)
{
}
}
答案 0 :(得分:6)
方差仅适用于参考类型。在您的代码TType
中也可以是值类型。如果添加class
约束,代码将编译
class Test<TType> where TType : class, A
{
public Test(IEnumerable<TType> testTypes)
{
DoSomething(testTypes);
}
void DoSomething(IEnumerable<A> someAs)
{
}
}
您可以找到详细解释here