Примите во внимание следующее:
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 найдено " и " Aожидается, 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 # чистый и бесшумный?
Почему-то кажется, что это не может быть правдой.Итак, вопрос: я что-то упустил?Как мне сделать это одновременно компактным и рабочим?