2016-03-09 4 views
1

Исходя из фона C#, я пытаюсь назначить экземпляр класса другому экземпляру класса в F #, но я получаю сообщение об ошибке «Исключение инициализации типа»Класс F # присваивает значение объекта другому объекту

Мой код

//filename is CCPType.fs 

module CCPType = 

    type CCPClass() = class 
     let mutable p = Unchecked.defaultof<int> 
     let mutable d = Unchecked.defaultof<int[,]> 

     member self.P 
      with get() = p 
      and set (value) = p <- value 

     member self.D 
      with get() = d 
      and set (value) = d <- value 

    end 

//filename is Programme.fs 

Module Start = 

    [<EntryPoint>] 
    let main argv = 
     let record = FileParser.ParseTextToCCPRecord(text) // returns CCPClass 
     let z = Optimiser.Execute(record) //arg is of type CCPClass 

//filename is Optimiser.fs 

module Optimiser = 

    let mutable ccpDataSet = CCPClass() 

следующие фрагменты являются частью Optimiser.fs в модуле оптимизатора. Я попытался следующие

let Execute record = 
     ccpDataSet <- record 

, и я также пытался

let Execute(record: CCPClass) = 
     ccpDataSet = new CCPClass() 
     ccpDataSet.P <- record.P 
     ccpDataSet.D <- record.D 

, и я также пытался

let Execute(record: CCPClass) = 
     ccpDataSet <- new CCPClass() 
     ccpDataSet.P <- record.P 
     ccpDataSet.D <- record.D 

, и я также пытался

let Execute record = 
     ccpDataSet.P <- record.P 
     ccpDataSet.D <- record.D 

и я пробовал несколько разных способов, но я ill не может копировать один экземпляр класса в другой.

Я получаю сообщение об ошибке «Необработанное исключение типа« Исключение System.TypeInitializationException ».

«" ccpDataSet "выбрасывает исключение типа" System.TypeInitializationException "'.

Любые идеи? Спасибо

+0

где ошибка? Можете ли вы предоставить минимальный, но полный пример, показывающий проблему? - Наверное, мне не нужно говорить вам, что это довольно много идиоматический F # здесь – Carsten

+0

Что такое 'InnerException'? –

+0

Внутреннее исключение - {System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в . $ Optimiser..cctor() в D: \ CCP \ Optimiser.fs: строка 19} –

ответ

2

Благодаря Федору и Карстен, я понял это.

let mutable private OpenD : bool[] = Array.zeroCreate<bool> ccpDataSet.D.Length 

Так как я новичок в F # это не ведет себя как C#, я пытался установить длину в открытой компании нулевого экземпляра. Изменил его до 0, и он работает :)

+0

Это не совсем правильно. При инициализации экземпляра CCPClass вы используете 'Unchecked.defaultof ' как значение для 'd'. Как и в C#, значение по умолчанию для ссылочного типа равно null, поэтому вы получили исключение NullReferenceException, когда пытались разыменовать его с помощью 'ccpDataSet.D.Length'. –

+0

и, конечно, 'D.Length' не было даже в вопросе ... поэтому вы всегда должны предоставить минимальный пример, демонстрирующий вашу проблему! – Carsten

+0

Кроме того, идиоматическая версия F # для копирования всех или части типа будет выглядеть следующим образом: 'type Record = { p: int; d: int [,]; } 'для определения типа, ' let record = {p = 0; d = null} 'для создания экземпляра и ' let recordCopy = {запись с p = 5} 'для получения измененной копии. –

Смежные вопросы