【问题标题】:F# class assign an object value to another objectF# 类将一个对象值分配给另一个对象
【发布时间】:2016-06-24 04:51:16
【问题描述】:

来自 C# 背景,我试图将一个类的实例分配给 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()

以下sn-ps 都是Optimiser 模块中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

我已经尝试了很多不同的方法,但我仍然无法将一个实例化的类复制到另一个。

我收到错误“System.TypeInitializationException”类型的未处理异常。

'"ccpDataSet" 引发了类型为 "System.TypeInitializationException"' 的异常。

有什么想法吗?谢谢

【问题讨论】:

  • 那个错误是在哪里抛出的?你能提供一个最小但完整的例子来说明这个问题吗? - 我想我不必告诉你这是非常反惯用的 F#
  • InnerException 是什么?
  • 内部异常是 {System.NullReferenceException: 对象引用未设置为对象的实例。在 .$Optimiser..cctor() 在 D:\CCP\Optimiser.fs:line 19}
  • 第 19 行让可变私有 OpenD : bool[] = Array.zeroCreate ccpDataSet.D.Length
  • @user4633919 这很好,但你应该帮自己一个忙:请不要试图照原样复制 C# 代码——你会非常失望——而是学习 FP,然后你会失望C# ;)

标签: c# .net visual-studio oop f#


【解决方案1】:

感谢 Fyodor 和 Carsten,我想通了。

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

由于我是 F# 新手,它的行为不像 C#,我试图将 OpenD 的长度设置为空实例。将其更改为 0 并且可以正常工作:)

【讨论】:

  • 这不太正确。初始化 CCPClass 实例时,您使用 Unchecked.defaultof&lt;int[,]&gt; 作为 d 的值。就像在 C# 中一样,引用类型的默认值为 null,因此当您尝试使用 ccpDataSet.D.Length 取消引用时会收到 NullReferenceException。
  • 当然D.Length 甚至不在问题中......这就是为什么你应该总是提供一个最小的例子来证明你的问题!
  • 此外,复制全部或部分类型的惯用 F# 版本是:type Record = { p:int; d:int[,]; } 用于类型定义,let record = { p = 0; d = null } 用于创建实例,let recordCopy = { record with p = 5 } 用于获取修改后的副本.
  • @ChrisHannon 最初我用 Array.zeroCreate 10 对其进行了初始化,但这导致了同样的错误,所以我切换到了这个。
  • @ChrisHannon 我会试试你给出的例子。塔。
猜你喜欢
  • 2011-12-24
  • 1970-01-01
  • 2017-01-25
  • 2019-12-27
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
相关资源
最近更新 更多