问题
this should be a quick one for all you f# rockers, but it's got me stuck at the moment.
I've got an F# type which I'm trying to get to implement a c# interface
public interface ICrudService<T> where T: DelEntity, new()
{
IEnumerable<T> GetAll();
}
here's how it's implemnted in c#:
public IEnumerable<T> GetAll()
{
return repo.GetAll();
}
repo.GetAll
returns an IQueryable
, but the c# compiler knows enough to convert to IEnumerable
because IQueryable<T> : IEnumerable<T>
. but In F# the compiler can't work it and I've tried a few attempt to cast it correctly
type CrudService<'T when 'T :(new : unit -> 'T) and 'T :> DelEntity>(repo : IRepo<'T>) =
interface ICrudService<'T> with
member this.GetAll () =
repo.GetAll<'T>
this is giving me a type mismatch error
回答1:
You need to cast to 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>
回答2:
What if you used Seq.cast<'T? It sounds like it just needs to be casted to the correct Type. Since IEnumerables are implemented differently in F# than they are in C#.
let seqCast : seq<int> = Seq.cast repo.GetAll<'T>
来源:https://stackoverflow.com/questions/23973233/get-from-iqueryable-to-ienumerable