繁体   English   中英

无法转换IEnumerable <Class1> 到IEnumerable <T> ?

[英]Cannot convert IEnumerable<Class1> to IEnumerable<T>?

以下代码将在方法调用NewMethod<T>(p1, p2);参数p1p2上出现两个错误NewMethod<T>(p1, p2);

  1. p1 :无法将IQueryable<ICollection<Class1>>转换为IQueryable<ICollection<T>>
  2. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM