Определение класса F # с и без интерфейса - PullRequest
1 голос
/ 21 октября 2010

Почему это приемлемо:

type SomeClass<'T> =
    val mutable id : int
    val mutable result : 'T

Но это не так:

type SomeIface = 
    abstract id : int

type SomeClass<'T> = 
    interface SomeIface with
        val mutable id : int
        val mutable result : 'T

Компилятор жалуется на то, что я использовал 'val', и говорит мне использовать 'member', но тогда я не могу использовать mutable.

Ответы [ 2 ]

4 голосов
/ 21 октября 2010

Деско ответ правильный. Что касается , почему ваш подход не работает, ключ к этому в F #, когда у вас есть что-то вроде

interface Iface with
   [indented lines here]

строки с отступом могут содержать только реализации членов интерфейса. Они не должны содержать дополнительных полей или членов типа, который вы определяете (например, два изменяемых поля в вашем случае). Поэтому ответ Desco работает, как и что-то вроде следующего:

type SomeIface = 
    abstract id : int

type SomeClass<'T> = 
    interface SomeIface with
        member this.id = this.id
    val mutable id : int
    val mutable result : 'T
4 голосов
/ 21 октября 2010

переместить поля выше реализации интерфейса

type SomeIface = 
    abstract id : int

type SomeClass<'T>() = 
    [<DefaultValue>]
    val mutable id : int
    [<DefaultValue>]
    val mutable result : 'T
    interface SomeIface with
        member this.id = this.id

let x = SomeClass<int>(id = 10)
let y : SomeIface = upcast x
printfn "%d" y.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...