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:
stringis 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 tostring(orfin my repro). In e.g. the case where you upcast toobj, we know that we want to inline theobjversion ofstring, so that is ok.