Can anyone explain why the second example below won't compile?
'Test 2' gives "error FS0670: This code is not sufficiently generic. The type variable ^a could not be generalized because it would escape its scope.". I fail to understand this error message.
// Test 1
type test1<'a> = | A of 'a
with
override t.ToString() =
match t with
| A a -> a.ToString()
// Test 2
type test2<'a> = | A of 'a
with
override t.ToString() =
match t with
| A a -> string a
// Test 3
type test3<'a> = | A of 'a
with
override t.ToString() =
match t with
| A a -> string (a :> obj)
Here's another repro:
let inline f< ^T>(x:^T) = box x
type test4<'a> = | A of 'a
with
member t.M() =
match t with
| A a -> f a
string
is an inline function that uses static type constraints, and the error diagnostics for such functions are sometimes poor. I don't really understand the diagnostic message itself, but the point is, at the call site, we don't know the generic type 'a
, which means we can't inline the right version of the call to string
(or f
in my repro). In e.g. the case where you upcast to obj
, we know that we want to inline the obj
version of string
, so that is ok.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With