3
votes

I am trying to use C# library in F# so it would be very much specific case. I using Servicestack with F#. Now, I am trying to wire up class with interface using method

RegisterAutoWiredAs<T,'TAs>()

signature. Here is 'T is having constraint that it has to implement 'TAs. It works fine in C# code.

But F# is having constraint while using interface.

let f:IFoo = Foo() // will give type error
let fi:IFoo - Foo() :> IFoo // will work

Here Foo has implemented IFoo. So, this part is quite different than C# equivalent. Now, above signature is giving type error if I do like this

container.RegisterAutoWiredAs<Foo,IFoo>()

And there is noway to do casting while giving parameter.

Here is line from original project I am trying to run. Everything in this code works other than this part and also sadly other equivalent methods are also failing.

And here is the error I am getting in that project

This expression was expected to have type 'MemoryChatHistory' but here has type 'IChatHistory'

1
What error are you getting? - Fyodor Soikin
@FyodorSoikin type mismatch. I can't use Foo with IFoo in method signature. I have updated the question with error message. - kunjee
This call to RegisterAutoWiredAs cannot produce such error. Are you sure it's happening on that line and not on a different one? - Fyodor Soikin
@FyodorSoikin have you tried with my code? Sorry but couldn't get your question properly. I'm pretty much sure that error is because of F# compiler as things are working with C#. - kunjee
Are you sure that the error is on that exact line and not on another one? Can you maybe post the full error message (with the line number included)? - Fyodor Soikin

1 Answers

1
votes

F# does not support implicit interface implementations.

I think you may be able to work around this in this instance by making IChatHistory an abstract class rather than an interface (using [<AbstractClass>] attribute).

EDIT:

Nope, I had a chance to play around with it today. I think it's impossible to call this method directly with those type parameters from F#. See this question

How do I translate a `where T : U` generic type parameter constraint from C# to F#?

for a little more discussion.

You might be able to work around this by using reflection to call the method.