Я пытаюсь преобразовать C # класс в F #:
type Aggregator<'T when 'T : (new : unit -> 'T)>()=
static let ApplyMethod = "Apply"
member val private _aggregations : IDictionary<Type, obj> = new Dictionary<Type, obj>()
member val AggregateType = typeof<'T> with get
member val Alias = Unchecked.defaultof<string> with get
Однако кажется, что даже этот простой код не может скомпилироваться:
Program.fs
: 1189 Ожидалось, что это выражение будет иметь тип
'IDictionary<Type,obj>
но тут есть тип
'Dictionary<Type,obj>
'
Означает ли это, что поле, объявленное с типом интерфейса IDictionary<Type, obj>
, не может вывести переданное значение, зная, что это конкретное значение реализует этот интерфейс Dictionary<Type, obj>
?
На самом деле, если я явно повышаю до IDictionary<Type, obj>
:
member val private _aggregations : IDictionary<Type, obj> =
(new Dictionary<Type, obj>() :> IDictionary<Type, obj>)
Это работает, значит ли это, что F # в этом отношении строже, чем C #?