[英]Cannot convert IEnumerable<Class1> to IEnumerable<T>?
以下代码将在方法调用NewMethod<T>(p1, p2);
参数p1
和p2
上出现两个错误NewMethod<T>(p1, p2);
。
p1
:无法将IQueryable<ICollection<Class1>>
转换为IQueryable<ICollection<T>>
? p2
:无法将IEnumerable<Class1>
转换为IEnumerable<T>
如何解决方法调用?
public interface IBase<out T> { T Prop1 { get; } }
class Class1 : IBase<int> { public int Prop1 { get; set; } }
static IEnumerable<T> NewMethod<T, U>(IQueryable<ICollection<T>> exist, IEnumerable<T> bs)
where T : IBase<U>
{
return null;
}
public IEnumerable<T> Existed<T>(IEnumerable<T> p2)
{
.....
if (typeof(T) == typeof(Class1)) {
IQueryable<ICollection<T>> p1 = null;
return result = NewMethod<Class1, int>(p1, p2);
} .....
}
是协方差还是逆方差问题?
OP最初问一个问题,为什么泛型不能与ICollection<T>
。 在我回答之后,OP更改为询问有关IEnumerable<T>
其他问题,因此该答案不再适用。
是协方差还是逆方差问题?
是的,因为ICollection<T>
不是协变的,所以编译器无法用Class1
代替IBase<U>
。
尝试使用IEnumerable<T>
而不是ICollection<T>
( IEnumerable<T>
是协变的)。
你为什么不能这样做?
public IEnumerable<T> Existed<T, U>(IEnumerable<T> bands) where T : IBase<U> {
IQueryable<IEnumerable<T>> p1 = null;
IEnumerable<T> p2 = null;
return NewMethod<T, U>(p1, p2);
}
它需要几种类型的转换。
public IEnumerable<T> Existed<T>(IEnumerable<T> p2) // where T : IBase<U>
{
if (typeof(T) == typeof(Class1)) {
IQueryable<ICollection<T>> p1 = null;
return NewMethod<Class1, int>( // Type parameter are assigned
p1 as IQueryable<ICollection<Class1>>,
p2 as IEnumerable<Class1>
) as IEnumerable<T>;
}
....
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.