从IQueryable到IEnumerable

时间:2014-05-31 17:27:12

标签: casting f#

对于你所有的摇滚歌手来说,这应该是一个快速的,但它让我陷入困境。

我有一个F#类型,我试图实现一个c#接口

public interface ICrudService<T> where T: DelEntity, new()
{
    IEnumerable<T> GetAll();
}

这里是如何在c#:

中实现的
public IEnumerable<T> GetAll()
{
    return repo.GetAll();
}

repo.GetAll返回IQueryable,但c#编译器知道足以转换为IEnumerable因为IQueryable<T> : IEnumerable<T>。但是在F#中,编译器无法正常工作,我已经尝试了一些尝试正确地投射它

type CrudService<'T when 'T :(new : unit -> 'T) and 'T :> DelEntity>(repo : IRepo<'T>) = 
    interface ICrudService<'T> with
         member this.GetAll () = 
            repo.GetAll<'T>

这给了我一个类型不匹配错误

2 个答案:

答案 0 :(得分:7)

你需要施展到IEnumerable<'T>

type CrudService<'T when 'T :(new : unit -> 'T) and 'T :> DelEntity>(repo : IRepo<'T>) = 
        interface ICrudService<'T> with
             member this.GetAll () = 
                repo.GetAll() :> IEnumerable<'T>

答案 1 :(得分:1)

如果您使用Seq.cast<'T?该怎么样?听起来只需要将其转换为正确的类型。由于IEnumebles在F#中的实现方式与在C#中的实现方式不同。

let seqCast : seq<int> = Seq.cast repo.GetAll<'T>