Рассмотрим это:
module Module1 =
type A() = class end
type B() = inherit A()
type C() = inherit A()
let f x = if x > 0 then new B() else new C()
Последняя строка дает ошибку о ожидаемом типе B, но вместо этого выбирается тип C. Хорошо, я могу притвориться, что понимаю это: компилятор не знает, какую общую базу следует делать, если их много.
Но угадайте, что? Даже когда я указываю тип функции, он все равно не работает:
let f x : A = if x > 0 then new B() else new C()
Теперь это дает мне две ошибки: "Ожидаемый, B найден" и "Ожидаемый, C найден". WTF? Почему он не видит, что оба B и C неявно конвертируются в A?
Да, я знаю, что я мог бы использовать upcast
, например:
let f x : A = if x > 0 then upcast new B() else upcast new C()
Но угадайте, что (снова)? upcast
работает только при наличии явного объявления типа функции!
Другими словами, это:
let f x = if x > 0 then upcast new B() else upcast new C()
все еще дает ошибку.
WTF?! Мне действительно нужно добавить 50% шума в мою программу, чтобы помочь компилятору? Что со всей этой шумихой о том, что код F # чист и бесшумен?
Как-то кажется, что это не может быть правдой. Так что вопрос: я что-то упустил? Как сделать это как компактным, так и работающим?